首页 > 代码库 > 大数加法
大数加法
问题:我有一个非常简单的问题给你。给定两个整数A和B,你的工作是计算A + B的总和
分析:不能定义两个整数去相加,当数太大后,数据就会溢出,比如:112233445566778899+998877665544332211。所以使用两个字符数组,将每一个数作为数组的一个元素存进去,然后再把两个字符数组相加存入一个结果的数组。
困难:两个数组相加,会存在进位和溢出
解决:将数组里面的元素倒过来然后相加,若进位了,设置一个判断是否进位的条件,若进位了acc=1,没进位acc=0,sum[i]=s1[i]-‘0‘+s2[i]-‘0‘+acc。
代码:
#include <stdio.h> #include<string.h> #include <stdlib.h> int main() { char s1[1000],s2[1000],sum[1001],s3[1000],s4[1000]; int t,x; void reverse(char*s); void add(char*s1,char*s2,char*sum); scanf("%d",&t); x=1; while(t--) { s1[1000]=‘0‘; s2[1000]=‘0‘; scanf("%s %s",s1,s2); strcpy(s3,s1); strcpy(s4,s2); add(s1,s2,sum); if(t!=0) printf("Case %d:\n%s + %s = %s\n\n",x,s3,s4,sum); else printf("Case %d:\n%s + %s = %s\n",x,s3,s4,sum); x++; } return 0; } void reverse(char*s) { int length; int i=0; char temp; length=strlen(s); while(i<length-i-1) { temp=s[i]; s[i]=s[length-i-1]; s[length-i-1]=temp; i++; } } void add(char*s1,char*s2,char*sum) { int len1=strlen(s1); int len2=strlen(s2); int acc=0,temp,i; reverse(s1); reverse(s2); for(i=0;i<len1 && i<len2;i++) { temp=s1[i]-‘0‘+s2[i]-‘0‘+acc; sum[i]=temp%10+‘0‘; if(temp>=10) acc=1; else acc=0; } if(i<len1) { for(;i<len1;i++) { temp=s1[i]-‘0‘+acc; sum[i]=temp%10+‘0‘; if(temp>=10) acc=1; else acc=0; } } if(i<len2) { for(;i<len2;i++) { temp=s2[i]-‘0‘+acc; sum[i]=temp%10+‘0‘; if(temp>=10) acc=1; else acc=0; } } if(acc==1) sum[i++]=‘1‘; sum[i]=‘\0‘; reverse(sum); }
大数加法
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。