hdu 1753大小数相加
生活随笔
收集整理的这篇文章主要介绍了
hdu 1753大小数相加
小编觉得挺不错的,现在分享给大家,帮大家做个参考.
传送门: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 */转载于:https://www.cnblogs.com/zhangmingzhao/p/7256687.html
总结
以上是生活随笔为你收集整理的hdu 1753大小数相加的全部内容,希望文章能够帮你解决所遇到的问题。
- 上一篇: RedisLive监控工具 window
- 下一篇: CNN Mnist