鸽了好久没学的高精度,今天终于下决心开始了...
什么情况下使用高精度算法
一般情况下)数据范围超过long long(-922 3372 0368 5477 5808 ~ 922 3372 0368 5477 5807)就必须使用高精度否则会造成数据的溢出
基本思想
用数组逐位储存数字,再模拟竖式加法运算,数组下标可以看作位数,对应位进行运算:个位对个位,十位对十位。。。如果a的位数高于b,例如:1234+344,则可以看作1234+0334。
步骤
0.定义数组a,b,c(用来存储最终结果),字符串x,y(使用字符串方便读入),对a,b,c进行清零!!(忘记清零导致debug了好久,,)
1.读入字符串x,y
2.反序构造数组a,b(为什么要反序呢,因为我们实际算加法的时候都是从个位,也就是数组的第一个元素开始计算。如果正序输入的话会导致两数组的最高位相加)
3.模拟竖式计算
4.判断是否进位(如果进位但没有给lengthc++的话会导致最高位不输出)
5.反序输出结果(从最高位输出
上代码
#include <stdio.h>
#include<string.h>
#include<stdlib.h>
int main(){
char x[600],y[600];
int a[600]={0},b[600]={0},c[600]={0};
scanf("%s %s",x,y);
int la=strlen(x);
int lb=strlen(y);
int lc=la>lb?la:lb;
int t=600;
for(int i=0;i<la;i++){
a[la-i]=x[i]-'0';
}
for(int i=0;i<lb;i++){
b[lb-i]=y[i]-'0';
}
for(int i=1;i<=lc;i++){
c[i]=c[i]+a[i]+b[i];
c[i+1]=c[i]/10;
c[i]%=10;
}
if(c[lc+1]>0) lc++;
for(int k=lc;k>0;k--){
printf("%d",c[k]);
}
return 0;
}
反思
注意数组和变量的初始化问题,已经很多次在这种低级的问题上浪费时间了。
在数组初始化时如果采用“完全不初始化”即 int a[5],这种做法会导致数组中的值全部为垃圾值
在数组初始化时如果采用“不完全初始化”即 int a[5]={1},这种做法会导致数组中除了已经被明确初始化过的元素之外全部被初始化为0。在这个例子中,a[0]==1,a[1]==a[2]==a[3]==a[4]==0。