大数相加也算经典题之一了吧

 

大数相加

  关于C语言大数(有千百位数的)问题,一般都是使用字符串来记录的。这里,将分享一下大数的代码。

*分析

*就大数相加而言,首先末位对其,然后换成整数相加在加上进位

*记录进位,并对结果取模换成字符存入

*重复上述过程,直到公共部分加完

*然后把未加完的加进去

代码如下

 

 1 char* BigSum(char *a,char*b)//传入的为两个大数
 2 {
 3     char* c=(char*)calloc(N+1,sizeof(char));//其中N为宏定义大数的最大位数
 4     int len_a=strlen(a);
 5     int len_b=strlen(b);//用len_a和len_b来记录两个数的位数
 6     int k=N-1;
 7     int jinwei=0;//进位信息
 8 
 9     for (len_a-=1,len_b-=1;len_a>=0&&len_b>=0 ;k--,len_a--,len_b-- )//全部从后面开始
10     {                                        //结束的条件是公共部分计算完成
11         c[k]=(a[len_a]-'0'+b[len_b]-'0'+jinwei)%10+'0';//转换数字相加取模变字符
12         jinwei=(a[len_a]-'0'+b[len_b]-'0')/10;//进位信息
13     }
14 
15     for (;len_a>=0 ;len_a-- ,k--)//若a组还有剩余
16     {
17         c[k]=(a[len_a]-'0'+jinwei)%10+'0';
18             jinwei=(a[len_a]-'0')/10;
19     }
20     for (;len_b>=0 ;len_b-- ,k--)//若b组还有剩余
21     {
22             c[k]=(b[len_b]-'0'+jinwei)%10+'0';
23                 jinwei=(b[len_b]-'0')/10;
24     }
25     if(jinwei!=0)//最后结束时,进位是否还有
26         c[k]=jinwei+'0';
27     for (k=0;k<101 ;k++ )//k已经无用,现用来记录结果的地址位置
28     {
29         if(c[k]!='\0')
30             break;
31     }
32     return c+k;
33 }

 

其实大数还是较为简单的,仅仅是将数字换成了字符来储存而已,下面为测试信息

 1 #include <stdio.h>
 2 #include<string.h>
 3 #include<stdlib.h>
 4 #define N 100                //这里的N为大数的最大位数(结果最大为N+1)
 5 
 6 /*此处为上述代码*/
 7 
 8 int main(void)
 9 {
10     char a[N],b[N];
11     gets(a);
12     gets(b);
13     printf("结果为:\n");
14     puts(BigSum(a,b));
15     return 0;
16 }    

 

运行结果为:

 

 

 

---仅供参考---

posted @ 2016-04-18 17:37  Rmfone  阅读(241)  评论(0)    收藏  举报