传送门:http://acm.hdu.edu.cn/showproblem.php?pid=1753
最简小数是小于 1 的数的整数部分需要去掉?
import java.math.BigInteger; import java.util.Scanner; import java.math.BigDecimal; public class Main { public static void main(String args[]) { Scanner in = new Scanner(System.in); while(in.hasNext()) { BigDecimal a = in.nextBigDecimal(); BigDecimal b = in.nextBigDecimal(); String ans = a.add(b).stripTrailingZeros().toPlainString(); if(ans.startsWith("0")) //去掉前导0 { ans = ans.substring(1); } System.out.println(ans); } } }
还有这个stripTrailZero()对String和大数类都奏效可以用
C/C++版本:
/*小数点后面的位数可以直接相加,小数点前面的按末尾相加(和小数点后相加不同)。 1.注意小数点的进位,如果0位(大于10)还要继续进位,大于10则取余后将tmp2记为1,不大于10则tmp2记为0,小数点前的第一位加tmp2。我就是先进完位再加tmp2错了几次。 2.输出的时候判断.要不要输出。*/ #include <iostream> //1753 #include <cstdio> #include <algorithm> #include <cstring> using namespace std; char s1[500], s2[500]; int a[500], a2[500], b[500]; int lena, lenb, tmp1, tmp2, st1, st2, d2; void cal() { int i, j, c=0; st1=0, st2=0; for(i=0; i<lena; i++) { if(s1[i]!='.') a[i]+=s1[i]-'0'; else { st1=max(st1,i-1); break; } } if(i==lena) st1=lena-1; for(j=i+1; j<lena; j++) b[j-i-1]+=s1[j]-'0'; for(i=0; i<lenb; i++) { if(s2[i]!='.') a2[i]+=s2[i]-'0'; else { st2=max(st2,i-1); break; } } if(i==lenb) st2=lenb-1; for(j=i+1; j<lenb; j++) b[j-i-1]+=s2[j]-'0'; if(st1>=st2) c=1; if(c==1) { for(i=st1, j=st2; j>=0; i--,j--) a[i]+=a2[j]; } else { for(i=st1, j=st2; i>=0; i--,j--) a2[j]+=a[i]; for(i=st2; i>=0; i--) a[i]=a2[i]; } st1=max(st1,st2); } void add() { tmp1=0, tmp2=0; int i, j; for(i=499; i>=0; i--) if(b[i]!=0) break; for(j=i; j>=0; j--) { if(b[j]>=10&&j!=0) { b[j-1]+=1; b[j]%=10; } else if(b[j]>=10&&j==0) { b[j]%=10; tmp2=1; } } a[st1]+=tmp2; for(j=st1; j>=1; j--) { if(a[j]>=10) { a[j-1]+=1; a[j]%=10; } } } void output() { int flag=0, i, j; for(i=499; i>=0; i--) if(b[i]!=0) { d2=i; flag=1; break; } if(flag) { for(i=0; i<=st1; i++) printf("%d",a[i]); printf("."); for(j=0; j<=d2; j++) printf("%d",b[j]); puts(""); } else { for(i=0; i<=st1; i++) printf("%d",a[i]); puts(""); } } int main() { while(~scanf("%s%s",s1,s2)) { memset(a,0,sizeof(a)); memset(a2,0,sizeof(a2)); memset(b,0,sizeof(b)); lena=strlen(s1); lenb=strlen(s2); cal(); add(); output(); } return 0; } /* 99999.889 0.111 1000.0 10000.0 112233.1 333.9 123450000 777 123400000 777.700 0.000 0.0000 99999 1 1.2333 20.2667 1212121212.1111111 21212121.33300000000000000 */