标签:
大数相加运算
输入:a ,b两个整数
输出:a+b(结果最大可达1000位数字,123为3位数)
Sample Input:
122333444455555666666777777788888888999999999
985211
Sample Output:
122333444455555666666777777788888889000985210
这道题就是典型的大数相加运算
思路:我们可以先把数字存在字符串数组里,然后再转存到整型数组里,最后相加即可。
我们在数字位数小的那个数的前面补0,补到位数与另一个位数相同。那如何补0 ?其实很简单,一开始将设的两个整型数组初始化为0就好了。(int nn1[1000]={0},nn2[1000]={0};)
然后再将位数小的数字放在放在最后面。例如第一个数是45位,第二个数是6位,那么将第二个数从第40位开始存放,即从nn2[40]开始;最后所有的数字每位相加,大于10进1就好了。
122333444455555666666777777788888888999999999 45位数
985211 6位数
000000000000000000000000000000000000000985211
代码如下:
#include<cstdio> #include<cstring> #define maxn 1001 char num1[maxn],num2[maxn]; int nn1[maxn] = {0}; int nn2[maxn] = {0}; int main(void) { int i,len1,len2,max_len,mm; gets(num1);//先将数字存储在字符串数组中 gets(num2); len1 = strlen(num1); len2 = strlen(num2); mm = max_len = len1 > len2 ? len1 : len2;//max_len为两个数字中最大的数字的位数 //将两个字符串分别转换成整型数组,下面的i只是用来控制循环次数不是下标,我们从max_len下标开始存,一直到下标1,注意不是到0 for(i = 0; i < len1; i++,mm--) nn1[mm] = num1[len1-i-1]-‘0‘; mm = max_len; for(i = 0; i < len2; i++,mm--) nn2[mm] = num2[len2-i-1]-‘0‘; //倒过来开始相加 for(i = max_len; i >= 0; i--) { nn1[i] += nn2[i]; if(nn1[i] >= 10)//大于10,要进1 { nn1[i] %= 10;//这里也可写 nn1[i] = nn1[i]-10; nn1[i-1]++; //表示进1 } } //之前a[0]是用来存放进位数的,所以转换数字的时候没有使用 if(nn1[0]) //a[0]不等于0,说明有进位,则从a[0]开始打印,否则从a[1]开始 for(i = 0; i <= max_len; i++) printf("%d",nn1[i]); else for(i = 1; i <= max_len; i++) printf("%d",nn1[i]); return 0; }
标签:
原文地址:http://www.cnblogs.com/Muia/p/5736024.html