OpenJudge 2738 浮点数加法

1.链接地址:

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

2.题目:

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

题目中输入输出中出现浮点数都有如下的形式:
P 1P 2...P i.Q 1Q 2...Q j
对于整数部分,P 1P 2...P i是一个非负整数
对于小数部分,Q j不等于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 }

 

你可能感兴趣的:(open)