Problem Description
话说,经过了漫长的一个多月,小明已经成长了许多,所以他改了一个名字叫“大明”。
这时他已经不是那个只会做100以内加法的那个“小明”了,现在他甚至会任意长度的正小数的加法。
现在,给你两个正的小数A和B,你的任务是代表大明计算出A+B的值。
Input
本题目包含多组测试数据,请处理到文件结束。
每一组测试数据在一行里面包含两个长度不大于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
#include<iostream> #include<stdio.h> #include<cstring> using namespace std; int main() { int i,n,m1,m2,m; char a[400] = {'0'}; char b[400] = {'0'}; char c[400] = {'0'}; char d[400] = {'0'}; while(1) { strcpy(c,d); i=1,n=1,m1=0,m2=0; while(1) { a[i]=getchar(); if(a[i]==' ') { break; } if(a[i]=='.') { m1=i; } a[i]=a[i]-'0'; i++; } if(m1==0) { m1=i; } while(1) { b[n]=getchar(); if(b[n]==' '||b[n]=='\n') { break; } if(b[n]=='.') { m2=n; } b[n]=b[n]-'0'; n++; } if(m2==0) { m2=n; } m=i=(((m1>m2)?m1:m2)+((i-m1)>(n-m2)?(i-m1):(n-m2))); if(m1<i||m2<n) { for(i-=1; i>m1&&i>m2; i--) { c[i]=(c[i]+a[i]+b[i])%10; c[i-1]=(c[i]+a[i]+b[i])/10; } c[i]='.'-'0'; } m1-=1,m2-=1; for(i-=1; m1>=1||m2>=1; i--) { if(m1>=1&&m2>=1) { c[i]=(c[i]+a[m1]+b[m2])%10; c[i-1]=(a[m1]+b[m2])/10; m1--,m2--; } else { if(m1>=1&&m2<1) { c[i]=(c[i]+a[m1])%10; c[i-1]=(c[i]+a[m1])/10; m1--; } else { c[i]=(c[i]+a[m2])%10; c[i-1]=(c[i]+a[m2])/10; m2--; } } } if(c[0]==0) { for(n=1; n<=m-1; n++) { cout<<(char)(c[n]+'0'); } } else { for(n=0; n<=m-1; n++) { cout<<(char)(c[n]+'0'); } } cout<<endl; } return 0; }