高精度运算
不管是int还是double亦或者long long ,这些定义变量都有数据范围的一定限制,在计算位数超过十几位的数,也就是超过他们自身的数据范围时,不能采用现有类型进行计算,只能自己通过编写程序进行计算也就是高精度运算。
程序代码
#include<iostream>
#include<cstring>
using namespace std;
int main()
{
char a1[205],b1[205];//数组用来存储两个相加的数
int a[205],b[205],c[205],lena,lenb,lenc=1,i,x=0;
memset(a,0,sizeof(a));//对字符串初始化
memset(b,0,sizeof(b));
memset(c,0,sizeof(c));
gets(a1);
gets(b1);
lena=strlen(a1);//将数组长度赋值给len
lenb=strlen(b1);
for(i=0;i<lena;i++)
a[lena-i]=a1[i]-'0';//将字符串通过ASCALL值转化为整形变量
for(i=0;i<lenb;i++)
b[lenb-i]=b1[i]-'0';//通过倒序使数组两端的值互换
while(lenc<=lena||lenc<=lenb)
{
c[lenc]=a[lenc]+b[lenc]+x;
x=c[lenc]/10;
c[lenc]%=10;
lenc++;
}
c[lenc]=x;
while(c[lenc]==0)//最高位的0要舍弃
{
lenc--;
}
for(i=lenc;i>=1;i--)
{
cout<<c[i];
}
cout<<endl;
return 0;
}
需要注意的地方
当一个输入的数据超过定义变量所支持的数据范围时(比如400位的数,一亿是9位数),用数组的方法更容易求所需求的的数据,用数组的一个空间来当作数的位数,即个位十位百位。这样用一个数组来储存一个数据,支持计算的数据范围更大,也简单易懂。
代码解读
memset() 函数常用于内存空间初始化,在代码的开头,我使用了memset()对数组进行初始化,即对数组a,b,c全部赋值为0。注意不能用它将int数组初始化为0和-1之外的其他值(除非该值高字节和低字节相同)。在数组的创建之后,数组内剩余的空间会出现野值,若不清零,则在函数进行运算时会出现乱码。由于数组类型定义时是字符型,所以需要写一段代码进行转化,使之变为整形变量,使用高精度计算,数据的存入也有特殊方法,即倒序存入,通常开头第一个数据输入值是表示整个数据的长度,比如八位数据,则键入8。之后的数据从最高位到最低位一个一个排开单个键入。