//深刻认识到自己的粗心,为此浪费了一天。。
Problem Description
话说,经过了漫长的一个多月,小明已经成长了许多,所以他改了一个名字叫“大明”。
这时他已经不是那个只会做100以内加法的那个“小明”了,现在他甚至会任意长度的正小数的加法。
现在,给你两个正的小数A和B,你的任务是代表大明计算出A+B的值。
这时他已经不是那个只会做100以内加法的那个“小明”了,现在他甚至会任意长度的正小数的加法。
现在,给你两个正的小数A和B,你的任务是代表大明计算出A+B的值。
Input
本题目包含多组测试数据,请处理到文件结束。
每一组测试数据在一行里面包含两个长度不大于400的正小数A和B。
每一组测试数据在一行里面包含两个长度不大于400的正小数A和B。
Output
请在一行里面输出输出A+B的值,请输出最简形式。详细要求请见Sample Output。
Sample Input
1.1 2.9 1.1111111111 2.3444323343 1 1.1
Sample Output
4 3.4555434454 2.1
Author
linle
继续大数,这次是大 小数,
我用了一个结构体 分别存放 小数的 整数部分 和 小数部分,两个数组,分别相加,进位 分别处理,同时要注意 前导0 和 后导0 的处理。。详细看代码
************************/
// 小数 位的加法有问题 #include <iostream> #include <string.h> #include <stdio.h> using namespace std; #define N 8000 struct Bint// 大数的结构体 { int high[N/2];// 存放整数位 int low[N/2];// 存放小数位 int p;// 整数位非零位数 int del; // 小数位非零位数 }; int Find(char a,char str[])// 找小数点的位置,实际返回的是整数部分的位数 { int i,len = strlen(str); for(i = 0;i<len;i++) if(str[i]==a) return i; return len;// 整数时直接返回 长度 } void print(struct Bint s)// 输出函数 { int i; for(i = s.p-1;i>=0;i--) printf("%d",s.high[i]); if(s.del>0){ printf("."); for(i = 0;i<s.del;i++) printf("%d",s.low[i]); } printf("\n"); } void trans(Bint &a,char str[])// 将输入的字符串形式的数 转换为结构体 { memset(a.high,0,sizeof(a.high)); memset(a.low,0,sizeof(a.low)); int len = strlen(str); a.p = Find('.',str); a.del = (len==a.p)?0:(len-a.p-1);// 如果包含小数点则小数位数为 数的长度-整数位数-1 int i=0,ii = 0,jj = 0,pa= a.p,l = len-1; while(str[i++]=='0'&&i<pa)// 去除前导0 a.p--; while(str[l--]=='0'&&l>=pa)// 去除 后导 0 a.del--; for(i = pa-1;i>=pa-a.p;i--)// 整数位赋值 a.high[ii++] = str[i]-'0'; for(i = pa+1;i<pa+1+a.del;i++)// 小数位 赋值 a.low[jj++] = str[i]-'0'; } void add(char A[],char B[])// 加法 代码核心 { int i; Bint a,b,ans;// ans 存 结果 memset(ans.low,0,sizeof(ans.low)); memset(ans.high,0,sizeof(ans.high)); trans(a,A); trans(b,B); ans.p = (a.p>b.p)?a.p:b.p;// 取a,b 整数位的最大值 ans.del = (a.del>b.del)?a.del:b.del;// 同上,取小数位 // 以下两个循环为逐位相加的过程 for(i = 0;i<ans.p;i++) ans.high[i] = a.high[i]+b.high[i]; for(i = 0;i<ans.del;i++) ans.low[i] = a.low[i]+b.low[i]; // 进位处理 for(i = ans.del-1;i>0;i--) { if(ans.low[i]>=10) { ans.low[i-1]+=ans.low[i]/10; ans.low[i]%=10; } } //小数位第一位有进位时的处理 if(ans.low[0]>=10) { ans.high[0]+=ans.low[0]/10; ans.low[0]%=10; } for(i = 0;i<ans.p;i++) { if(ans.high[i]>=10) { ans.high[i+1]+=ans.high[i]/10; ans.high[i]%=10; } } if(ans.high[ans.p]>0) ans.p+=1; // 相加以后产生后导 0 的处理 while(ans.low[ans.del-1]==0) ans.del--; print(ans); } int main() { char A[N],B[N]; while(cin>>A>>B) { add(A,B); } return 0; }