大数相加
关于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 }
运行结果为:
---仅供参考---
时间: 2024-11-06 04:57:35