hdu 1753大小数相加

来源:互联网 发布:ip网络寻呼话筒怎么用 编辑:程序博客网 时间:2024/06/16 23:34

传送门: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.1111000.0 10000.0112233.1 333.9123450000 777123400000 777.7000.000 0.000099999 11.2333 20.26671212121212.1111111 21212121.33300000000000000*/


0 0
原创粉丝点击