A+B Problem IV
时间限制:
1000 ms | 内存限制:
65535 KB
难度:
3
-
描述
-
acmj最近发现在使用计算器计算高精度的大数加法时很不方便,于是他想着能不能写个程序把这个问题给解决了。
-
输入
-
包含多组测试数据
每组数据包含两个正数A,B(可能为小数且位数不大于400)
输出
- 每组输出数据占一行,输出A+B的结果,结果需要是最简的形式。 样例输入
-
1.9 0.1 0.1 0.9 1.23 2.1 3 4.0
样例输出
-
2 1 3.33 7
-
包含多组测试数据
思路:把两个数当字符串输入,存放到两个数组中。再检测是否有小数点,开两个数组大小为前面两倍,中间一个位置存放小数点,小数点左边存放小数部分,小数点右边存放整数部分(倒着存放)。然后两个倒序后的数组相加,用第三个同等大小的数组存放结果。同时检测整数部分前面的零和小数部分后面的零,去掉多余的零。详细看代码部分。
#include<stdio.h> #include<string.h> char s1[410],s2[410]; int a1[820],b1[820]; char result[820]; void create(char *s,int *a) { int len=strlen(s); int k; if(strchr(s,'.')!=NULL) //判断有无小数点 k=strchr(s,'.')-s; //标记小数点的位置 else k=len; // 无小数点 for(int i=k+1,j=399;i<len;i++,j--)//小数点后面的存到前四百位 a[j]=s[i]-'0'; for(int i=k-1,j=400;i>=0;i--,j++)//小数点前面的存放到后四百位 a[j]=s[i]-'0'; } void init() { memset(a1,0,sizeof(a1)); memset(b1,0,sizeof(b1)); memset(result,0,sizeof(result)); } void sum() { int s,v=0; for(int i=0;i<820;i++) { s=a1[i]+b1[i]+v; result[i]=s%10; v=s/10; } } void print() { int i=820; while(result[i]==0&&i>=400) { i--; } int j=0; while(result[j]==0&&j<400) { j++; } if(i==399&&j==400)//全是零的情况 printf("0\n"); else { for(;i>=400;i--) { printf("%d",result[i]); } if(j!=400) { printf("."); } for(int i=399;i>=j;i--) printf("%d",result[i]); printf("\n"); } } int main() { while(~scanf("%s %s",s1,s2)) { init(); //每计算一次初始化数组 create(s1,a1);//转化过程(2倍数组倒序存放小数或整数) create(s2,b1);//转化过程 sum();//进位求和过程 print(); } return 0; }