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
*/


posted @ 2017-02-06 10:58  Lawliet__zmz  阅读(196)  评论(0编辑  收藏  举报