ACM-简单题之大明A+B——hdu1753
来源:互联网 发布:spss数据缺失值处理 编辑:程序博客网 时间:2024/06/10 07:17
Time Limit: 3000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)
Total Submission(s): 7220 Accepted Submission(s): 2533
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
这道题。。。额,怎么说呢,就是一悲剧啊。
题目通俗易懂,说的在明白点就是高精度加法,
长度不大于400,显然大数问题,
这道题解法,要么对其小数点,然后开始加吧,
要么就是我这次做法:数分开存,加完了分别输出,
这题说难不难,说简单还真不简单(废话。。)
好吧,就是细心,各种情况都考虑考虑,
说半天废话,我就来个解题的关键吧:
神奇的测试数据:
前置0,后置0,第一个是小数点,相加进位等等:
1.0000000000000 3 .43
34345.34 32425345
8523400000 777.700
3435 4554
0.000 0.0000
99999 1
1.0001 2.9999
1.235262578623 2.29375824758243527200
23546756.345326547567454 .2142356754225653425346
00012.1 1.2000
99.0000001 0.9999999
.0 .0
答案:
1.43000000000003
32459690.34
8523400777.7
7989
0
100000
4
3.529020826205435272
23546756.5595622229900193425346
13.3
100
0
代码:
// 大明A+B#include <iostream>#include <string>using namespace std;string zs[3],xs[3];int len_zs1,len_zs2,len_zs3;int len_xs1,len_xs2,len_xs3;void deal(string str,int k){int len,dian;int i;len=str.length();dian=-1;for(i=0;i<len;++i)if(str[i]=='.')dian=i;// 如果不存在小数点,即全为整数 if(dian==-1){zs[k]=str;xs[k]="0";}// 如果没有整数 else if(dian==0){zs[k]="0";xs[k]=str.substr(dian+1,len);}else{zs[k]=str.substr(0,dian);xs[k]=str.substr(dian+1,len);}// 求各部分长度len_zs1=zs[0].length();len_zs2=zs[1].length();len_xs1=xs[0].length();len_xs2=xs[1].length();}// 求整数部分 void find_zs(){int i,j;zs[2]="";if(len_zs1>=len_zs2){for(i=0;i<len_zs1-len_zs2;++i)zs[2]+=zs[0][i];for(j=0;j<len_zs2;++i,++j)zs[2]+=(zs[0][i]+zs[1][j]-'0');for(i=len_zs1-1;i>0;--i)if(zs[2][i]>'9'){zs[2][i]-=10;zs[2][i-1]+=1;}if(zs[2][0]>'9'){zs[2][0]-=10;zs[2]="1"+zs[2];}}else{for(i=0;i<len_zs2-len_zs1;++i)zs[2]+=zs[1][i];for(j=0;j<len_zs1;++i,++j)zs[2]+=(zs[0][j]+zs[1][i]-'0');for(i=len_zs2-1;i>0;--i)if(zs[2][i]>'9'){zs[2][i]-=10;zs[2][i-1]+=1;}if(zs[2][0]>'9'){zs[2][0]-=10;zs[2]="1"+zs[2];}}}// 求小数部分 void find_xs(){int i,j;xs[2]="";if(len_xs1>=len_xs2){for(i=0,j=0;j<len_xs2;++i,++j)xs[2]+=(xs[0][i]+xs[1][j]-'0');for(;i<len_xs1;++i)xs[2]+=xs[0][i];for(i=len_xs1-1;i>0;--i)if(xs[2][i]>'9'){xs[2][i]-=10;xs[2][i-1]+=1;}if(xs[2][0]>'9'){xs[2][0]-=10;zs[0][len_zs1-1]+=1;}}else{for(i=0,j=0;i<len_xs1;++i,++j)xs[2]+=(xs[0][i]+xs[1][j]-'0');for(;j<len_xs2;++j)xs[2]+=xs[1][j];for(i=len_xs2-1;i>0;--i)if(xs[2][i]>'9'){xs[2][i]-=10;xs[2][i-1]+=1;}if(xs[2][0]>'9'){xs[2][0]-=10;zs[0][len_zs1-1]+=1;}}}// 判断小数是否为0 bool judge_xs(void){int i;for(i=0;i<len_xs3;++i)if(xs[2][i]!='0')return 0;return 1;}void xiuzheng(void){// 小数尾部0去除int i;for(i=len_xs3-1;i>=0;--i)if(xs[2][i]!='0')break;if(i!=len_xs3-1)xs[2]=xs[2].substr(0,i+1);// 小数位数长度若改变,要更新 len_xs3=xs[2].length();// 整数头部0去除for(i=0;i<len_zs3;++i)if(zs[2][i]!='0' || i==len_zs3-1)break;if(i!=0)zs[2]=zs[2].substr(i,len_zs3-1);len_zs3=zs[2].length();}int main(){string str1,str2;bool iszero;while(cin>>str1>>str2){deal(str1,0);deal(str2,1);// 先求小数部分,再求整数部分,小数会有进位 find_xs();find_zs();len_zs3=zs[2].length();len_xs3=xs[2].length();xiuzheng();iszero=judge_xs();if(iszero)cout<<zs[2]<<endl;elsecout<<zs[2]<<"."<<xs[2]<<endl;}return 0;}
PS:这道题,用JAVA做,不到20行。。
- ACM-简单题之大明A+B——hdu1753
- 大明A+B hdu1753
- hdu1753----大明A+B
- hdu1753 大明A+B
- hdu1753大明A+B
- hdu1753 大明A+B
- hdu1753大明A+B
- hdu1753 大明A+B
- hdu1753 大明A+B
- HDU1753 大明A+B
- Hdu1753 大明A+B
- HDU1753—大明A+B(大正小数相加)
- hdu1753大明A+B(高精度)
- hdu1753 大明A+B(高精度加法)
- 大明A+B(hdu1753)大数,java
- hdu1753 大明A+B && nyoj 513 A+B Problem IV
- HDU1753 大明A+B(带小数的大数加法)
- ACM-简单题之{A} + {B}——hdu1412
- SQL的主键和外键的作用
- 吴绛雪的回文诗
- 【c++系列】map容器实现的word count
- POJ1218THE DRUNK JAILER 快速和一般方法两种解法
- C# dataGridView1 绑定数据库
- ACM-简单题之大明A+B——hdu1753
- Ubuntu升级g++-4.8以支持C++11
- Linux C一站式学习习题答案11.5.2
- PLSQL性能优化方法
- 截断二进制指数退避算法(JAVA版)
- ============================================================ 博文原创,转载请声明出处 电子咖啡(原id蓝岩) ==============
- pat 1053
- 换个角度深入理解GlusterFS
- android学习: 酷狗手机遥控器