标签:
第一部分:题目
给出两个正整数A和B,计算A+B的值。保证A和B的位数不超过500位。
读入两个用空格隔开的正整数
输出A+B的值
3 12
15
两个正整数的位数不超过500位
第二部分:思路
由于数值比较大,所以用字符串形式接收。因为相加是从个位开始,所以可以从数组最后开始(这样需要判断哪个数长,稍微麻烦点)或者先把数组倒置在进行计算。这里使用的是后者。当两个数的长度不一样时需要把长的那个继续计算。在相加的过程中,需要判断是否需要进位,这里的flag变量其实就起到这个作用。
第三部分:代码
#include<stdio.h> #include<string.h> void repai(char s[500],int len)//把数组倒置 { int i,j=len-1; char t; for(i=0;i<j;i++) { j=len-i-1;//相当于以中点对折。 t=s[i]; s[i]=s[j]; s[j]=t; } } int main() { char a[500],b[500];//接收数a、b int result[501],length=0,alen,blen; scanf("%s %s",a,b); alen=strlen(a);//数组a、b长度 blen=strlen(b); int i,j,flag=0; repai(a,alen);//倒置 repai(b,blen); int t; for(i=0;i<alen&&i<blen;i++)//从个位开始相加 { t=a[i]-‘0‘+b[i]-‘0‘+flag; if(t>9)//判断是否需要进位 { t-=10; flag=1; } else//这里稍微注意一下,当前不需要进位时置为0 { flag=0; } result[length++]=t; } while(i<alen) { t=a[i]-‘0‘+flag; if(t>9) { t-=10; flag=1; } else { flag=0; } result[length++]=t; i++; } while(i<blen) { t=b[i]-‘0‘+flag; if(t>9) { t-=10; flag=1; } else { flag=0; } result[length++]=t; i++; } if(flag) { result[length++]=1; } for(i=length-1;i>=0;i--) { printf("%d",result[i]); } printf("\n"); return 0; }
3116 高精度练习之加法——http://codevs.cn/problem/3116/
标签:
原文地址:http://www.cnblogs.com/xiangguoguo/p/5379649.html