HDU1753(大数加法)
大明A+BTime Limit: 3000/1000 MS (Java/Others)????Memory Limit: 32768/32768 K (Java/Others)
Problem Description
话说,经过了漫长的一个多月,小明已经成长了许多,所以他改了一个名字叫“大明”。
这时他已经不是那个只会做100以内加法的那个“小明”了,现在他甚至会任意长度的正小数的加法。 现在,给你两个正的小数A和B,你的任务是代表大明计算出A+B的值。
?
Input
本题目包含多组测试数据,请处理到文件结束。
每一组测试数据在一行里面包含两个长度不大于400的正小数A和B。
?
Output
请在一行里面输出输出A+B的值,请输出最简形式。详细要求请见Sample Output。
?
Sample Input
?
Sample Output
?
#include<iostream> ? ??for(i=0;i<=len;i++) ?} #include<stdio.h> #include<string.h> char s[402],t[402],c[402]; int a[402]; int main() { ?int i,d,b,n,m,f,w1,w2; ?while(scanf("%s %s",s,t)>0) ?{ ??n=strlen(s); ??m=strlen(t); ??w1=w2=0; ??for(i=0;i<n;i++) ???if(s[i]!='.') ????if(s[i]!='0') ?????w1=1; ??for(j=0;j<m;j++) ???if(t[j]!='.') ????if(t[j]!='0') ?????w2=1; ??if(w1==0&&w2==0) ???printf("0"); ??else ??{ ??for(i=0;s[i]!=' '&&s[i]!='.';i++); ??for(j=0;t[j]!=' '&&t[j]!='.';j++); ??if(i==n) ??{ ???s[i]='.'; ???s[i+1]='0'; ???n+=2; ???s[n]=' '; ??} ??if(j==m) ??{ ???t[j]='.'; ???t[j+1]='0'; ???m+=2; ???t[m]=' '; ??} ??d=i; ??b=j; ??k=0; ?? ?? ??while(1) ??{ ???d--; ???b--; ???if(d<0) ????break; ???if(b<0) ????break; ???c[k++]=s[d]+t[b]; ??} ??if(d>=0) ???while(d>=0) ????c[k++]=s[d--]; ??if(b>=0) ???while(b>=0) ????c[k++]=t[b--]; ??k--; ??for(f=0;k>=0;k--,f++) ???if(c[k]>57) ????a[f]=c[k]-48*2; ???else ????a[f]=c[k]-48; ??a[f++]=-32767; ??while(1) ??{ ???i++; ???j++; ???if(i==n) ????break; ???if(j==m) ????break; ???a[f++]=s[i]+t[j]-2*48; ??} ??if(i<n) ???while(i<n) ???a[f++]=s[i++]-48; ??if(j<m) ???while(j<m) ????a[f++]=t[j++]-48; ??for(i=f-1;i>0;i--) ???if(a[i]>0) ???if(a[i]/10>0) ???{ ????if(a[i-1]>=0) ????a[i-1]+=a[i]/10; ????else ?????a[i-2]+=a[i]/10; ????a[i]=a[i]%10; ???} ??for(j=f-1;j>=0;j--) ???if(a[j]<0) ???{ ????j--; ????break; ???} ???else ???if(a[j]!=0) ????break; ??for(i=0;i<=j;i++) ???if(a[i]<0) ????printf("."); ???else ????printf("%d",a[i]); ??} ??printf("n"); ?} ?return 0; } ? (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |