大明A+B(HDU - 1753)
2020-05-11 04:10
190 查看
话说,经过了漫长的一个多月,小明已经成长了许多,所以他改了一个名字叫“大明”。
这时他已经不是那个只会做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
我用得笨 分成2部分整数相加和小数相加,写了快1个小时,额,我好菜
#include<stdio.h> #include<string.h> #include<queue> #include<algorithm> using namespace std; char a[450],b[450]; int a1[401],a2[401]; int a11[401],a22[401]; int b1[401],b2[401]; int b11[401],b22[401]; int c[401],c1[401],c2[401]; int main() { while(~scanf("%s %s",a,b)) { memset(a1,0,sizeof(a1)); memset(a2,0,sizeof(a2)); memset(b1,0,sizeof(b1)); memset(b2,0,sizeof(b2)); memset(c1,0,sizeof(c1)); memset(c2,0,sizeof(c2)); memset(a11,0,sizeof(a11)); memset(b11,0,sizeof(b11)); int l1=strlen(a); int l2=strlen(b); int flag=0; int l11=0,l12=0; int l21=0,l22=0; for(int i=0;i<l1;i++) { if(a[i]=='.') { flag=1; continue; } if(flag==0) { a1[l11++]=a[i]-'0'; } if(flag==1) { a2[l12++]=a[i]-'0'; } } flag=0; for(int i=0;i<l2;i++) { if(b[i]=='.') { flag=1; continue; } if(flag==0) { b1[l21++]=b[i]-'0'; } if(flag==1) { b2[l22++]=b[i]-'0'; } } /* for(int i=0;i<l11;i++) printf("%d",a1[i]); printf("\n"); for(int i=0;i<l12;i++) printf("%d",a2[i]); printf("\n"); for(int i=0;i<l21;i++) printf("%d",b1[i]); printf("\n"); for(int i=0;i<l22;i++) printf("%d",b2[i]);*/ int l=l12>l22?l12:l22; int ans=0; for(int i=l-1;i>=0;i--) { ans=a2[i]+b2[i]+ans; c2[i]=ans%10; ans=ans/10; } /*for(int i=0;i<l;i++) { printf("%d\n",c2[i]); }*/ int o=l11>l21?l11:l21; int o1=0; int p1=0; for(int i=l11-1;i>=0;i--) { a11[o1++]=a1[i]; } for(int i=l21-1;i>=0;i--) { b11[p1++]=b1[i]; } if(ans>0) a11[0]=a11[0]+1; /*for(int i=0;i<o1;i++) printf("%d",a11[i]); printf("\n"); for(int i=0;i<p1;i++) printf("%d",b11[i]);*/ int sum=0; for(int i=0;i<o;i++) { sum=a11[i]+b11[i]+sum; c1[i]=sum%10; sum=sum/10; } if(sum>0) printf("1"); for(int i=o-1;i>=0;i--) { printf("%d",c1[i]); } int flag2=0; for(int i=l-1;i>=0;i--) { if(c2[i]==0) { l--; } else { break; } } if(l>0) printf("."); for(int i=0;i<l;i++) printf("%d",c2[i]); printf("\n"); } return 0; }
让人看的眼花缭乱,好在AC了,然后我看了小郭学姐写的代码
#include<stdio.h> #include<string.h> #include<algorithm> using namespace std; char c1[410],c2[410]; int f1[1010],f2[1010],f3[1010]; void zh(char c[],int f[]) { char *it; ///指针传地址用 int g1,g2,t; int s=strlen(c); t=s; if((it=strstr(c,"."))!=NULL) ///strstr判断是否为子串 it是"."的地址 t=it-c; ///c数组名传递首地址 g1=g2=500; /// 500作为整数与小数的分界线 for(int i=t-1; i>=0; i--) f[g1--]=c[i]-'0'; ///整数部分 for(int i=t+1; i<s; i++) f[++g2]=c[i]-'0'; ///小数部分 } void jia() { int dz; for(int i=1000; i>=0; i--) ///相加倒着输出 { dz=f1[i]+f2[i]+f3[i]; if(dz<=9) f3[i]=dz; else { f3[i]=dz%10; f3[i-1]=dz/10; } } } void printf() { int d=1000,fg=0; while(d>500&&f3[d]==0)d--; ///去掉小数后面的无效0 for(int i=0; i<=500; i++) ///去掉整数前面的无效0 { if(fg)printf("%d",f3[i]); if(fg==0&&f3[i]) { fg=1; printf("%d",f3[i]); } } if(d>500)printf("."); ///有小数部分 for(int i=501; i<=d; i++) printf("%d",f3[i]); printf("\n"); } int main() { while(~scanf("%s %s",c1,c2)) { memset(f1,0,sizeof(f1)); memset(f2,0,sizeof(f2)); memset(f3,0,sizeof(f3)); zh(c1,f1); zh(c2,f2); jia(); printf(); } return 0; }
简单好多,就是有点没看懂,有空得好好问问。
Starry_Sky_Dream 原创文章 50获赞 4访问量 2319 关注 私信相关文章推荐
- HDU1753—大明A+B(大正小数相加)
- HDU - 1753 大明A+B
- hdu 1753 大明A+B(实数高精度)
- hdu 1753 大明A+B(高精度小数加法)
- HDU 1753 大明A+B(大数加法,数组模拟)
- hdu 1753 大明A+B(高精度小数加法)
- hdu 1753 大明A+B 长小数相加
- hdu 1753 大明A+B(大数)
- HDU 1753 -- 大明A+B(Java)
- HDU 1753 大明A+B(大小数加法,C模拟,Java BigDecimal)
- HDU 1753 大明A+B(高精度)
- HDU 1753 大明A+B(高精度浮点数运算)
- hdu 1753 大明A+B(高精度小数加法)
- HDU - 1753 - 大明A+B(高精度)
- HDU 1753-大明A+B(BigDecimal)
- HDU 1753 大明A+B (大数加法)
- HDU 1753-大明A+B(大数)
- HDU 1753 大明A+B(大数相加)(string::npos)
- hdu 1753 大明A+B (正小数相加)
- hdu1753 大明A+B (java大数练习第二弹 高精度小数)