高精度计算之基础

来源:互联网 发布:李涛疯狂淘宝上市 编辑:程序博客网 时间:2024/06/08 16:16

在使用计算机进行计算时,精度提高了,但有时会计算一些很大的数,它们超出了C++中定义的数据类型,
所以,我们要用一些技巧来计算它们。

基础:

高精度数一般都是成百上千位的,位数不会确定。
首先,我们要明确:高精度数在C++中没有定义,我们需要自己编写程序来计算!!!
大家现在回忆一下所学的计算知识,就可以发现,我们在小学所学的竖式计算,是很容易计算不定长度的两数相加、减、乘、除(虽然没有计算器方便)。
我们就可以顺着这个思路走下去,以下是细节方面。

读入:

上面已经说过原因,所以,我们读入必须使用字符串,再转到整型数组。
注意:
我们为了在计算时末位对齐,除了高精除低精之外,都采用倒序存储。

void Scan(int a[]){    string s;    cin>>s;    a[0]=s.length();    for(int i=1;i<=a[0];i++)        a[i]=s[a[0]-i]-'0';}

除此之外,我们也可以使用循环加数组的方法来读入(代码请读者自己去想)。

输出:

因为我们在存高精度数时,除高精除低精之外,均采用倒序存储。
所以,我们在输出时要采用倒序输出。

void Print(int a[]){    for(int i=a[0];i>=1;i--)        cout<<a[i];    cout<<endl;}

进位与借位的处理:

前面已经介绍过了,由于高精度数的加、减 、乘、除都是模拟小学我们所学过的竖式计算,所以,只要你发挥你的想象力,你就可以得出下面的所有代码。

加法:

c[i]=a[i]+b[i];if(c[i]>10){c[i]%=10;c[i+1]++;}

减法:

if(a[i]<b[i]){a[i+1]--;a[i]+=10;}c[i]=a[i]-b[i];

乘法:

这里先给出高精乘高精的进位法。

c[i+j-1]=a[i]*b[j]+x+c[i+j-1];x=c[i+j-1]/10;c[i+j-1]%=10;

除法:

除法是由减法与乘法模拟实现的,所以,我们可以使用减法和乘法来实现除法代码
基础部分到此结束,在下一节中,我们将学习高精度加法

原创粉丝点击