HDU1753 (大正小数相加)
Posted 若有恒,何必三更起五更眠;最无益,莫过一日曝十日寒。
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了HDU1753 (大正小数相加)相关的知识,希望对你有一定的参考价值。
题目链接:
http://acm.hdu.edu.cn/showproblem.php?pid=1753
大明A+B
Time Limit: 3000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)
Total Submission(s): 14422 Accepted Submission(s): 5290
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
分析:
一共3种情况:
1.两个数都是整数
2.两个数都是小数
3.一个整数,一个小数
将他们都变成两个小数的情况,很巧妙,然后就是小数点对齐,空的地方补0(首尾),使得化成的两个小数的长度是一样的,然后就是大数加法的知识了
注意点:
1.小数部分对整数部分有进位的时候,进位不要加在了小数点上面
2.结果是整数的时候,只输出整数部分,比如4.000要输出4
3.结果后面多余的0要去掉,比如2.10000要变成2.1
4.注意输入是这种情况的时候:
1.56 .36(就是小于1的小数输入的时候他把0去掉了)
代码如下:
#include<bits/stdc++.h> using namespace std; string add(string str1,string str2) { int l1=str1.length(),l2=str2.length(); int x1=0,x2=0,y1=0,y2=0; for(int i=l1-1;i>=0;i--) { if(str1[i]!=‘.‘) { y1++; if(y1==l1) { str1=str1+‘.‘+‘0‘; y1=1; } } else break; } for(int i=l2-1;i>=0;i--) { if(str2[i]!=‘.‘) { y2++; if(y2==l2) { str2=str2+‘.‘+‘0‘; y2=1; } } else break; } if(y1>y2) { int k=y1-y2; for(int i=1;i<=k;i++) { str2=str2+‘0‘; } }else if(y1<y2) { int k=y2-y1; for(int i=1;i<=k;i++) { str1=str1+‘0‘; } } for(int i=0;i<l1;i++) { if(str1[i]!=‘.‘) x1++; else break; } for(int i=0;i<l2;i++) { if(str2[i]!=‘.‘) x2++; else break; } if(x2>x1) { int k=x2-x1; for(int i=1;i<=k;i++) { str1="0"+str1; } }else if(x1>x2) { int k=x1-x2; for(int i=1;i<=k;i++) { str2="0"+str2; } } l1=str1.length(); string str3=""; int c=0; for(int i=l1-1;i>=0;i--) { if(str1[i]==‘.‘) { str3=‘.‘+str3; continue; } int x=str1[i]-‘0‘+str2[i]-‘0‘+c; c=x/10; x=x%10; str3=char(x+‘0‘)+str3; } if(c!=0) { str3=char(c+‘0‘)+str3; } int l3=str3.length(),f=1; for(int i=l3-1;str3[i]!=‘.‘;i--) { if(str3[i]!=‘0‘) f=0; } if(f==1) { string str4=""; for(int i=0;str3[i]!=‘.‘;i++) { str4=str4+str3[i]; } return str4; } string str5=""; int ff; l3=str3.length(); for(int i=l3-1;i>=0;i--) { if(str3[i]!=‘0‘) { ff=i; break; } } for(int i=ff;i>=0;i--) { str5=str3[i]+str5; } return str5; } int main() { string a,b; while(cin>>a>>b) { string r=add(a,b); cout<<r<<endl; } return 0; }
以上是关于HDU1753 (大正小数相加)的主要内容,如果未能解决你的问题,请参考以下文章