一、高精度加法
1、大整数的输入
int的范围,正负上下限大约为2.1*10^9;
long long的范围,正负上下限大约为9.2*10^18;
如果整数成千上万位,那么这么大的整数我们如何处理?
方法:先用字符串输入,然后把每一个字符转换成为数字,存到一个int数组里
int数组中的一个位置储存之前整数的一位数字
#include<bits/stdc++.h>
using namespace std;
char s[110];
int a[110];
int main(){scanf("%s",s+1);int len=strlen(s+1);for(int i=1;i<=len;i++){a[i]=s[i]-'0';}
}
例题:
#include<bits/stdc++.h>
using namespace std;
char s[110];
int a[110];
int main(){scanf("%s",s+1);int len=strlen(s+1);for(int i=1;i<=len;i++){a[i]=s[i]-'0';}for(int i=1;i<=len;i++){printf("%d",a[i]);}return 0;
}
2、大整数翻转
字符串的顺序是从左到右的,而加法运算是从低位到高位(从右到左的),这样的存在数组对后面的运算不方便
例如:9999+5的大数运算
如果这样存储那么,进1的1就得存储到和的数组s[1],那么其他的位数就需要向后移动,而且这样非常的不方便,而且加数2还需要和加数1对齐这样非常的不方便
我们不妨把数组反一下,这样就进1的1可以存储到s[5]
例题:
注意:之前的最后一位变成第一位, a[i]=s[len+1-i]
#include<bits/stdc++.h>
using namespace std;
char s[110];
int a[110];
int main(){scanf("%s",s+1);int len=strlen(s+1);for(int i=1;i<=len;i++){a[i]=s[len+1-i]-'0';}for(int i=1;i<=len;i++){printf("%d",a[i]);}return 0;
}
3、高精度加法1
例题:大数+个位数
先用一个int数组a存储12345,用int变量b存储8,int数组c存储和
首先个位相加,c[1]=a[1]+b,结果是13,需要进1;
c[1]保留3,把1给下一位;
c[2]=a[2]+1,结果是5,不需要进位。
c[3],c[4],c[5]同理;
注意:如果是9999+9=10008,需要一直向高位传递;
#include<bits/stdc++.h>
using namespace std;
char s[110];
int a[110],b,c[110];
int main(){//对数组c进行初始化;memset(c,0,sizeof(c)) ;scanf("%s",s+1);scanf("%d",&b);int lena=strlen(s+1),lenc=lena;for(int i=1;i<=lena;i++){a[i]=s[lena+1-i]-'0';}//计算 c[1]=a[1]+b;for(int i=1;i<=lenc;i++){c[i+1]=a[i+1]+c[i]/10;// 表示c[2]=a[2]+1