两个整型大数相加
发布时间:2020-12-14 03:54:19 所属栏目:大数据 来源:网络整理
导读:/************************************************************************//*大数加法 题目: 求两个100位数以内的加法 不含100位。分析:由于数据类型的溢出。所以不能使用基本的数据类型。应该使用字符串来 表示。数据结构:两个99位相加,和最多是100
/************************************************************************/ /* 大数加法 题目: 求两个100位数以内的加法 不含100位。 分析:由于数据类型的溢出。所以不能使用基本的数据类型。应该使用字符串来 表示。 数据结构:两个99位相加,和最多是100位。再加一个Null结束。101位。 输入 运算 输出 */ /************************************************************************/ #include <stdio.h> #include <string.h> #define LEN_100 100 #define SUM_LEN_101 101 char *nizhi(char *p) //字符数组的逆置 { int len=strlen(p); for(int i=0;i<len/2;++i) //注意最后的一个NULL不要算 { char ctemp=p[i]; p[i]=p[len-i-1]; p[len-i-1]=ctemp; } return p; } /*函数: bignumadd 输入:字符数组a,字符数组b 输出:字符数组sum 返回:字符数组sum 分析:两个大数相加。由于从末尾相加:所以按照末尾对齐。可以使用字符串逆置。 从Index=0对于位相加。相加有两个问题:一个是进位问题。一个是和问题。 carrybit=(carrybit+a[i]+b[i])/10; 取商更新carrybit; sum[i]=(a[i]+b[i]+carrybit)%10; 值取余 判断最后一位是否有进位,有就sum[i]='1'否则为'0'; */ char *bignumadd(const char *a,const char *b,char *sum) { int cbit=0; //进位 char ia[LEN_100]={0}; char ib[LEN_100]={0}; int lena=strlen(a); int lenb=strlen(b); for(int i=0;i<lena;i++) //字符数组变数字数组 ia[i]=a[i]-'0'; for(int i=0;i<lenb;i++) //字符数组变数字 ib[i]=b[i]-'0'; int i=0; for(;i<lena || i<lenb;i++) { sum[i]=(ia[i]+ib[i]+cbit)%10+'0'; //取余 sum[i]是字符 cbit=(ia[i]+ib[i]+cbit)/10; //取商 } if(cbit) //如果最后为1 则表示最末尾有进位 sum[i]=1+'0'; return sum; } void main() { while(1) { char a[LEN_100]={0}; //初始化 最多99位 最多需要100位来存 char b[LEN_100]={0}; //两个存储字符数组 char sum[SUM_LEN_101]={0}; printf("输入被加数a:n"); gets(a); nizhi(a); printf("输入加数b:n"); gets(b); nizhi(b); printf("和为:n%sn",nizhi(bignumadd(a,b,sum))); } } 参考:http://www.voidcn.com/article/p-xjozelbj-vu.html (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |