码迷,mamicode.com
首页 > 其他好文 > 详细

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

时间:2016-04-18 18:48:49      阅读:117      评论:0      收藏:0      [点我收藏+]

标签:

 

大数相加

  关于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 }    

 

运行结果为:

 技术分享

 

 

---仅供参考---

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

标签:

原文地址:http://www.cnblogs.com/feng124/p/5405260.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!