【HDU 1753 大明A+B】 高精度加法

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1753

题目大意:  给你两个不超过400位的带小数的整数,求出透明的和,要求小数后面的后缀0不能输出。

 

解题思路:

题目很简单,思路也比较清晰。

不难,但就是要注意的地方很多。 小数点后面的位数可以直接相加,小数点前面的按末尾相加(和小数点后相加不同)。

1.注意小数点的进位,如果0位(大于10)还要继续进位,大于10则取余后将tmp2记为1,不大于10则tmp2记为0,小数点前的第一位加tmp2。我就是先进完位再加tmp2错了几次。

2.输出的时候判断.要不要输出。

测试样例在代码最后,过了这个基本就能过吧。。

 

  1 #include <iostream> //1753

  2 #include <cstdio>

  3 #include <algorithm>

  4 #include <cstring>

  5 using namespace std;

  6 

  7 char s1[500], s2[500];

  8 int  a[500], a2[500], b[500];

  9 int lena, lenb, tmp1, tmp2, st1, st2, d2;

 10 

 11 void cal()

 12 {

 13     int  i, j, c=0;

 14     st1=0, st2=0;

 15     for(i=0; i<lena; i++)

 16     {

 17         if(s1[i]!='.')  a[i]+=s1[i]-'0';

 18         else {  st1=max(st1,i-1);  break; }

 19     }

 20     if(i==lena) st1=lena-1;

 21     for(j=i+1; j<lena; j++)

 22         b[j-i-1]+=s1[j]-'0';

 23     for(i=0; i<lenb; i++)

 24     {

 25         if(s2[i]!='.')  a2[i]+=s2[i]-'0';

 26         else {  st2=max(st2,i-1); break; }

 27     }

 28     if(i==lenb) st2=lenb-1;

 29     for(j=i+1; j<lenb; j++)

 30         b[j-i-1]+=s2[j]-'0';

 31     if(st1>=st2)  c=1;

 32     if(c==1)

 33     {

 34         for(i=st1, j=st2; j>=0; i--,j--)

 35             a[i]+=a2[j];

 36     }

 37     else

 38     {

 39         for(i=st1, j=st2; i>=0; i--,j--)

 40             a2[j]+=a[i];

 41         for(i=st2; i>=0; i--)

 42             a[i]=a2[i];

 43     }

 44     st1=max(st1,st2);

 45 }

 46 

 47 void add()

 48 {

 49     tmp1=0, tmp2=0;

 50     int i, j;

 51     for(i=499; i>=0; i--)

 52         if(b[i]!=0) break;

 53     for(j=i; j>=0; j--)

 54     {

 55         if(b[j]>=10&&j!=0)

 56         {

 57             b[j-1]+=1;

 58             b[j]%=10;

 59         }

 60         else if(b[j]>=10&&j==0)

 61         {

 62             b[j]%=10;

 63             tmp2=1;

 64         }

 65     }

 66     a[st1]+=tmp2;

 67     for(j=st1; j>=1; j--)

 68     {

 69         if(a[j]>=10)

 70         {

 71             a[j-1]+=1;

 72             a[j]%=10;

 73         }

 74     }

 75 }

 76 

 77 void output()

 78 {

 79     int flag=0, i, j;

 80     for(i=499; i>=0; i--)

 81       if(b[i]!=0)

 82       {

 83           d2=i;  flag=1; break;

 84       }

 85     if(flag)

 86     {

 87         for(i=0; i<=st1; i++)

 88             printf("%d",a[i]);

 89         printf(".");

 90         for(j=0; j<=d2; j++)

 91            printf("%d",b[j]);

 92         puts("");

 93     }

 94     else

 95     {

 96         for(i=0; i<=st1; i++)

 97             printf("%d",a[i]);

 98         puts("");

 99     }

100 }

101 

102 int main()

103 {

104     while(~scanf("%s%s",s1,s2))

105     {

106         memset(a,0,sizeof(a));

107         memset(a2,0,sizeof(a2));

108         memset(b,0,sizeof(b));

109         lena=strlen(s1);

110         lenb=strlen(s2);

111         cal();

112         add();

113         output();

114     }

115     return 0;

116 }

117 

118 /*

119 99999.889 0.111

120 1000.0 10000.0

121 112233.1 333.9

122 123450000 777

123 123400000 777.700

124 0.000 0.0000

125 99999 1

126 1.2333 20.2667

127 1212121212.1111111 21212121.33300000000000000

128 */

 

 

 

你可能感兴趣的:(HDU)