hdu1753大明A+B(大数模拟)
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): 5483 Accepted Submission(s): 1850
Problem Description
话说,经过了漫长的一个多月,小明已经成长了许多,所以他改了一个名字叫“大明”。 这时他已经不是那个只会做100以内加法的那个“小明”了,现在他甚至会任意长度的正小数的加法。
现在,给你两个正的小数A和B,你的任务是代表大明计算出A+B的值。
现在,给你两个正的小数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
思路:纯模拟题,这题最简单的方法是用java写,下面我分别给出java和C++的代码,可见java做大数题的优越感,呵呵呵
java代码如下:
import java.math.BigDecimal; import java.util.Scanner; public class Main { public static void main(String[] args) { Scanner cin=new Scanner(System.in); while(cin.hasNextBigDecimal()){ BigDecimal b1=cin.nextBigDecimal(); BigDecimal b2=cin.nextBigDecimal(); b1=b1.add(b2); b1=b1.stripTrailingZeros(); System.out.println(b1.toPlainString()); } } }
C++代码如下:
#include<iostream> using namespace std; int has_point(char * str) { int i; for(i=0;str[i];i++) if(str[i]=='.') return i; return 0; } void add_r(int x,int n,char* str) { int i=x; while(n--) { str[i++]='0'; } str[i]='\0'; } void add_l(int len,int n,char *str) { int i; for(i=len;i>=0;i--) str[i+n]=str[i]; while(n) { str[--n]='0'; } } int main() { char num1[888],num2[888]; while(~scanf("%s%s",num1,num2)) { int len1=strlen(num1); int len2=strlen(num2); int pos1,pos2; if(!(pos1=has_point(num1))) { num1[len1]='.'; pos1=len1; num1[len1+1]='\0'; len1++; } if(!(pos2=has_point(num2))) { num2[len2]='.'; pos2=len2; num2[len2+1]='\0'; len2++; } int cnt; if(len1-pos1>len2-pos2) { cnt=len1-pos1-len2+pos2; add_r(len2,cnt,num2); len2+=cnt; } else { cnt=len2-pos2-len1+pos1; add_r(len1,cnt,num1); len1+=cnt; } // puts(num1); // puts(num2); if(pos1>pos2) { add_l(len2,pos1-pos2,num2); len2+=pos1-pos2; } else if(pos2>pos1) { add_l(len1,pos2-pos1,num1); len1+=pos2-pos1; } // puts(num1); // puts(num2); // cout<<len1<<" "<<len2<<endl; int p=0,flag=0,i; for(i=len1-1;i>=0;i--) { if(num1[i]!='.') { int num=num1[i]-'0'+num2[i]-'0'+p; if(num>=10) { p=1; num1[i]='0'+num-10; } else { p=0; num1[i]='0'+num; } if(num1[i]!='0'||i==pos1) flag=1; if(!flag) num1[i]='\0'; } else { if(!num1[i+1]) num1[i]='\0'; flag=1; } } if(p) putchar('1'); puts(num1); } return 0; } // 1111.12231200 // 0011.88999999
尼玛!!!java写大数太有优越感了!!!!