zoukankan      html  css  js  c++  java
  • 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
    */


  • 相关阅读:
    转移虚拟机后ubuntu network available SIOCSIFADDR: No such device
    模板中国剩余定理
    数论 CF27E Number With The Given Amount Of Divisors
    模板 输入输出优化
    模板 欧拉定理
    洛谷P1141 01迷宫
    图论拓扑排序
    归并排序 分治
    HZNUACM寒假集训Day12小结 数论入门 题解
    组合数学基础
  • 原文地址:https://www.cnblogs.com/zhangmingzhao/p/7256687.html
Copyright © 2011-2022 走看看