HDU1753 (大正小数相加)

题目链接:

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): 14422    Accepted Submission(s): 5290

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

分析:

一共3种情况:

1.两个数都是整数

2.两个数都是小数

3.一个整数,一个小数

将他们都变成两个小数的情况,很巧妙,然后就是小数点对齐,空的地方补0(首尾),使得化成的两个小数的长度是一样的,然后就是大数加法的知识了

注意点:

1.小数部分对整数部分有进位的时候,进位不要加在了小数点上面

2.结果是整数的时候,只输出整数部分,比如4.000要输出4

3.结果后面多余的0要去掉,比如2.10000要变成2.1

4.注意输入是这种情况的时候:

1.56  .36(就是小于1的小数输入的时候他把0去掉了)

代码如下:

#include<bits/stdc++.h>
using namespace std;
string add(string str1,string str2)
{
    int l1=str1.length(),l2=str2.length();
    int x1=0,x2=0,y1=0,y2=0;
    for(int i=l1-1;i>=0;i--)
    {
        if(str1[i]!=‘.‘)
        {
            y1++;
            if(y1==l1)
            {
                str1=str1+‘.‘+‘0‘;
                y1=1;
            }
        }
        else
            break;
    }
    for(int i=l2-1;i>=0;i--)
    {
        if(str2[i]!=‘.‘)
        {
              y2++;
              if(y2==l2)
              {
                  str2=str2+‘.‘+‘0‘;
                  y2=1;
              }
        }
        else
            break;
    }
    if(y1>y2)
    {
        int k=y1-y2;
        for(int i=1;i<=k;i++)
        {
            str2=str2+‘0‘;
        }
    }else if(y1<y2)
    {
        int k=y2-y1;
        for(int i=1;i<=k;i++)
        {
            str1=str1+‘0‘;
        }
    }
    for(int i=0;i<l1;i++)
    {
        if(str1[i]!=‘.‘)
            x1++;
        else
            break;
    }
    for(int i=0;i<l2;i++)
    {
        if(str2[i]!=‘.‘)
            x2++;
        else
            break;
    }
    if(x2>x1)
    {
        int k=x2-x1;
        for(int i=1;i<=k;i++)
        {
            str1="0"+str1;
        }
    }else if(x1>x2)
    {
        int k=x1-x2;
        for(int i=1;i<=k;i++)
        {
            str2="0"+str2;
        }
    }
    l1=str1.length();
    string str3="";
    int c=0;
    for(int i=l1-1;i>=0;i--)
    {
        if(str1[i]==‘.‘)
        {
            str3=‘.‘+str3;
            continue;
        }
        int x=str1[i]-‘0‘+str2[i]-‘0‘+c;
        c=x/10;
        x=x%10;
        str3=char(x+‘0‘)+str3;
    }
    if(c!=0)
    {
        str3=char(c+‘0‘)+str3;
    }
    int l3=str3.length(),f=1;
    for(int i=l3-1;str3[i]!=‘.‘;i--)
    {
        if(str3[i]!=‘0‘)
            f=0;
    }
    if(f==1)
    {
        string str4="";
        for(int i=0;str3[i]!=‘.‘;i++)
        {
            str4=str4+str3[i];
        }
        return str4;
    }
    string str5="";
    int ff;
    l3=str3.length();
    for(int i=l3-1;i>=0;i--)
    {
       if(str3[i]!=‘0‘)
       {
           ff=i;
           break;
       }
    }
    for(int i=ff;i>=0;i--)
    {
        str5=str3[i]+str5;
    }
    return str5;
}
int main()
{
    string a,b;
    while(cin>>a>>b)
    {
        string r=add(a,b);
        cout<<r<<endl;
    }
    return 0;
}

原文地址:https://www.cnblogs.com/yinbiao/p/8759046.html

时间: 2024-10-11 06:44:21

HDU1753 (大正小数相加)的相关文章

HDU1753—大明A+B(大正小数相加)

大明A+B Time Limit: 3000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total Submission(s): 9105    Accepted Submission(s): 3235 Problem Description 话说,经过了漫长的一个多月,小明已经成长了许多,所以他改了一个名字叫"大明". 这时他已经不是那个只会做100以内加法的那个"小明"了

NYOJ131 小数相加 【字符串】

小数相加 时间限制:1000 ms  |  内存限制:65535 KB 难度:4 描述 给你两个个小数,你能计算出它们的和是多少吗? 你肯定会说,so easy. 可是,如果这些小数中有的是无限循环小数呢? 无限循环小数一般有三部分,整数部分,小数不循环部分,和小数循环部分. 比如: 1.2(34)的三部分分别为1 2 34. 2.(04)的整数部分为2,小数不循环部分不存在,小数循环部分为04 2.4的整数部分为2,小数不循环部分为4,小数循环部分不存在 一般小数循环部分在小数的最后. 现在,

hdu 1002 A + B Problem II(大正整数相加)

代码: #include<cstdio> #include<cstring> #define Min(a,b) ((a)<(b)?(a):(b)) using namespace std; char s1[10000],s2[10000],s3[10000]; int main() { int t; scanf("%d",&t); int tt=0; while(t--) { ++tt; if(tt!=1) printf("\n"

python 小数相加报错 invalid literal for int() with base 10

for i in column1: x = int(i) s += xprint "sum:",s,"count:",len(column1)# round (s / len(column1), 3)print "avg",round (s / len(column1), 3) Traceback (most recent call last): File "C:/3/csv测试.py", line 26, in <mo

js 小数相加

<!DOCTYPE html> <html xmlns="http://www.w3.org/1999/xhtml"> <head runat="server"> <meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> <title></title> <script&

JS中小数相加相减时出现很长的小数点的解决方式

1.问题: 平时写的代码中会出现这种情况,parseFloat(11.3-10.1) 运行的结果依然是1.200000000000001 代码示例: var arr = [0.0111,11.002,0.3,1.5,1.61] var total = 0 arr.forEach(item =>{ total += item }) console.log(total) 返回的结果---  14.423100000000002,这种情况就不合常理. 2.解决方案: 这里有一种可行的解决方法,应用到M

JS处理小数相加出现溢出的问题

1.首先呈现一下问题: let a = 0.1 + 0.2let b = 0.3我们的期望:a==b 为true结果:a==b 为false打印一下a和b的值分别为:0.30000000000000004 和 0.3 2.在实际应用中如何匹配a和b的值呢?有一种常见的方法是设置一个误差范围值,通常称为“机器精度”.可以使用Number.EPSILON来比较两个数字是否相等.下面定义方法如下: function numberCloseEqual(n1,n2) { return Math.abs(n

大数与小数的求和算法

原文首发于我的微信公众号:GeekArtT . 在计算机求和的过程中,一个大数和小数的相加会因为浮点数的有限精度,而导致截断误差的出现.所以在构建计算网格的时候,都要极力避免这样情形的发生,将计算统一在相对较近的数量级上.所以,当需要对一系列的数值做加法时,一个好的技巧是将这些数由大到小做排列,再逐个相加. 而如果一定要做出这样的大数与小数的求和,一个直观想法就是:大数部分和小数部分的高位相加,将剩余的小数部分作为单独的"补全"部分相加.这种直观想法的官方名称叫做Kahan求和法. 假

ACM 大数相加

大数问题 基本都可以归结到大数相加上来 做大数问题  要返璞归真 回到小学里做加法 把数字读入到字符串数组中  每个位数一 一相加  主要考虑进位问题 如果整数的话 左边用零补齐 小数的话要左右分开补齐零  小数的零要补右边 HDOJ题目在1002 1753 下面给代码  整数相加 #include <stdio.h> #include <string.h> #define SIZE 1000 void convert(char a[],char newa[]) { memset(