zoukankan      html  css  js  c++  java
  • hdu1753大明A+B(大数模拟)

    http://acm.hdu.edu.cn/showproblem.php?pid=1753

    大明A+B

    Time Limit: 3000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total Submission(s): 5483    Accepted Submission(s): 1850

    Problem Description
    话说,经过了漫长的一个多月,小明已经成长了许多,所以他改了一个名字叫“大明”。 这时他已经不是那个只会做100以内加法的那个“小明”了,现在他甚至会任意长度的正小数的加法。
    现在,给你两个正的小数A和B,你的任务是代表大明计算出A+B的值。
     
    Input
    本题目包含多组测试数据,请处理到文件结束。 每一组测试数据在一行里面包含两个长度不大于400的正小数A和B。
     
    Output
    请在一行里面输出输出A+B的值,请输出最简形式。详细要求请见Sample Output。
     
    Sample Input
    1.1 2.9 1.1111111111 2.3444323343 1 1.1
     
    Sample Output
    4 3.4555434454 2.1
     
    思路:纯模拟题,这题最简单的方法是用java写,下面我分别给出java和C++的代码,可见java做大数题的优越感,呵呵呵
    java代码如下:
    import java.math.BigDecimal;
    import java.util.Scanner;
    public class Main {
        public static void main(String[] args) {
            Scanner cin=new Scanner(System.in);
            while(cin.hasNextBigDecimal()){
                BigDecimal b1=cin.nextBigDecimal();
                BigDecimal b2=cin.nextBigDecimal();
                b1=b1.add(b2);
                b1=b1.stripTrailingZeros();
                System.out.println(b1.toPlainString());
            }
        }
    }

    C++代码如下:

    #include<iostream>
    using namespace std;
    int has_point(char * str)
    {
        int i;
        for(i=0;str[i];i++)
            if(str[i]=='.')
                return i;
        return 0;
    }
    void add_r(int x,int n,char* str)
    {
        int i=x;
        while(n--)
        {
            str[i++]='0';
        }
        str[i]='\0';
    }
    void add_l(int len,int n,char *str)
    {
        int i;
        for(i=len;i>=0;i--)
            str[i+n]=str[i];
        while(n)
        {
            str[--n]='0';
        }
    }
    int main()
    {
        char num1[888],num2[888];
        while(~scanf("%s%s",num1,num2))
        {
            int len1=strlen(num1);
            int len2=strlen(num2);
            int pos1,pos2;
    
            if(!(pos1=has_point(num1)))
            {
                num1[len1]='.';
                pos1=len1;
                num1[len1+1]='\0';
                len1++;
            }
            if(!(pos2=has_point(num2)))
            {
                num2[len2]='.';
                pos2=len2;
                num2[len2+1]='\0';
                len2++;
            }
            int cnt;
            if(len1-pos1>len2-pos2)
            {
                cnt=len1-pos1-len2+pos2;
                add_r(len2,cnt,num2);
                len2+=cnt;
            }
            else
            {
                cnt=len2-pos2-len1+pos1;
                add_r(len1,cnt,num1);
                len1+=cnt;
            }
        //    puts(num1);
        //    puts(num2);
            if(pos1>pos2)
            {
                add_l(len2,pos1-pos2,num2);
                len2+=pos1-pos2;
            }
            else if(pos2>pos1)
            {
                add_l(len1,pos2-pos1,num1);
                len1+=pos2-pos1;
            }
        //    puts(num1);
        //    puts(num2);
        //    cout<<len1<<" "<<len2<<endl;
            int p=0,flag=0,i;
            for(i=len1-1;i>=0;i--)
            {
                if(num1[i]!='.')
                {
                    int num=num1[i]-'0'+num2[i]-'0'+p;
                    if(num>=10)
                    {
                        p=1;
                        num1[i]='0'+num-10;
                    }
                    else
                    {
                        p=0;
                        num1[i]='0'+num;
                    }
                    if(num1[i]!='0'||i==pos1)
                        flag=1;
                    if(!flag)
                        num1[i]='\0';
                }
                else
                {
                    if(!num1[i+1])
                        num1[i]='\0';
                    flag=1;
                }
            }
            if(p)
                putchar('1');
            puts(num1);
        }
        return 0;
    }
    //    1111.12231200
       // 0011.88999999

    尼玛!!!java写大数太有优越感了!!!!

  • 相关阅读:
    1.2 C++命名空间(namespace)
    1.3 C++引用(Reference)
    在ros功能包CMakeLists.txt中获取所在功能包的路径 便于添加第三方库的相对路径
    ubuntu14.04下搜狗输入法不能输入中文问题解决
    js对日期的判断
    Calendar用法随笔
    键盘事件
    onkeyup+onafterpaste 只能输入数字和小数点--转载
    导出数据到EXL表格中
    DENON AVR-X510BT 功放设置记录
  • 原文地址:https://www.cnblogs.com/crazyapple/p/2829942.html
Copyright © 2011-2022 走看看