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