在C语言中,无论采用哪种数据类型(int、float、long等)存储数据,它的长度都是有限的,超过这个长度的范围就会发生溢出。因此通过定义数据类型的方式实现任意长度的加法是不可能的。
大数加法的基本思路是把两个大数当作字符串接收,然后把字符串中每个字符从char类型转化成int类型,接下来就是逐位相加。这里需要注意的是判断是否需要进位。最后倒序输出即可。
要点:
1.数组存放
2.类型转化
3.进位相加
4.倒序输出
代码如下:
- #include<iostream>
- #include<cstring>
- #define M 100005
- using namespace std;
- char s1[M],s2[M];
- int a[M]={0},b[M]={0},c[M]={0};
- int main()
- {
- int m,n,i,k;
- while(cin>>s1>>s2)
- {
- memset(a,0,sizeof(a));
- memset(c,0,sizeof(c));
- memset(b,0,sizeof(b));
- m=strlen(s1);
- n=strlen(s2);
- k=m>n?m:n;
- for(i=0;i<m;i++)
- {
- a[i]=s1[m-i-1]-'0';
- }
- for(i=0;i<n;i++)
- {
- b[i]=s2[n-i-1]-'0';
- }
- for(i=0;i<=k;i++)//两个数的和的位数不一定与位数多的那个数的位数相同,可能大于 1,最后判断a[k]是否为零 所以这里多了一位 即(k+1)位
- {
- c[i]+=a[i]+b[i];
- if(c[i]>9)
- {
- c[i+1]++;
- c[i]-=10;
- }
- }
- if(c[k])//判断倒序相加后最高位 即a[k]是否为零
- {
- for(i=k;i>=0;i--)
- {
- cout<<c[i];
- }
- cout<<endl;
- }
- else
- {
- for(i=k-1;i>=0;i--)
- {
- cout<<c[i];
- }
- cout<<endl;
- }
- }
- return 0;
- }