• OpenJudge 2738 浮点数加法


    1.链接地址:

    http://bailian.openjudge.cn/practice/2738

    2.题目:

    总时间限制:
    1000ms
    内存限制:
    65536kB
    描述
    求2个浮点数相加的和

    题目中输入输出中出现浮点数都有如下的形式:
    P1P2...Pi.Q1Q2...Qj
    对于整数部分,P1P2...Pi是一个非负整数
    对于小数部分,Qj不等于0
    输入
    第1行是测试数据的组数n,每组测试数据占2行,分别是两个加数。每组测试数据之间有一个空行,每行数据不超过100个字符
    输出
    n行,每组测试数据有一行输出是相应的和。输出保证一定是一个小数部分不为0的浮点数
    样例输入
    2
    0.111111111111111111111111111111
    0.111111111111111111111111111111
    
    10000000.655555555555555555555555555555
    1.444444444444444444444444444445
    样例输出
    0.222222222222222222222222222222
    10000002.1

    3.思路:

    利用大整数加法的基础

    首先做预处理,去除小数点,小数较短的数补零

    计算后做后处理,首先判断是否有进位,有则拓展一位,去除小数后面的零,添加点

    4.代码:

     1 #include <iostream>
     2 #include <cstdio>
     3 #include <string>
     4 
     5 using namespace std;
     6 
     7 string sum(string s1,string s2)
     8 {
     9     if(s1.length()<s2.length())
    10     {
    11         string temp=s1;
    12         s1=s2;
    13         s2=temp;
    14     }
    15     int i,j;
    16     for(i=s1.length()-1,j=s2.length()-1;i>=0;i--,j--)
    17     {
    18         s1[i]=char(s1[i]+(j>=0?s2[j]-'0':0));   //注意细节
    19         if(s1[i]-'0'>=10)
    20         {
    21             s1[i]=char((s1[i]-'0')%10+'0');
    22             if(i) s1[i-1]++;
    23             else s1='1'+s1;
    24         }
    25     }
    26     return s1;
    27 }
    28 
    29 string real_sum(string s1,string s2)
    30 {
    31     string::size_type idx_s1_point = s1.find(".");
    32     s1.erase(idx_s1_point,1);
    33 
    34     string::size_type idx_s2_point = s2.find(".");
    35     s2.erase(idx_s2_point,1);
    36 
    37     string::size_type int_res_len = idx_s1_point>idx_s2_point?idx_s1_point:idx_s2_point;
    38 
    39     string::size_type dec_s1_len = s1.size() - idx_s1_point;
    40     string::size_type dec_s2_len = s2.size() - idx_s2_point;
    41 
    42     
    43 
    44     string::size_type dec_res_len;
    45     if(dec_s1_len < dec_s2_len)
    46     {
    47         s1 += string(dec_s2_len - dec_s1_len, '0');
    48         dec_res_len = dec_s2_len;
    49     }
    50     else
    51     {
    52         s2 += string(dec_s1_len - dec_s2_len, '0');
    53         dec_res_len = dec_s1_len;
    54     }
    55 
    56     string res = sum(s1,s2);
    57 
    58     if(res.size() > int_res_len + dec_res_len)
    59     {
    60         ++int_res_len;
    61     }
    62 
    63     string::size_type idx_res_tail = res.find_last_not_of("0");
    64 
    65     res = res.substr(0,idx_res_tail + 1);
    66     res.insert(int_res_len,".");
    67 
    68     return res;
    69 }
    70 
    71 int main()
    72 {
    73     
    74     int n;
    75     cin>>n;
    76 
    77     string s1,s2;
    78     while(n--)
    79     {
    80         cin>>s1>>s2;
    81         cout<<real_sum(s1,s2)<<endl;
    82     }
    83 
    84 
    85     return 0;
    86 }
  • 相关阅读:
    Kafka项目实践
    页级别的恢复
    Linux查看网卡流量(转)
    Linux Top 命令解析 比较详细(转)
    《神秘的程序员们》漫画26~28:《万年坑系列》 I、II、III(转)
    Linux概念架构的理解(转)
    Building Redis for use on Cygwin(转)
    2014值得期待的Erlang两本新书
    jps命令使用
    编译原理学习导论
  • 原文地址:https://www.cnblogs.com/mobileliker/p/3544693.html
Copyright © 2020-2023  润新知