【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 */

 

原文地址:https://www.cnblogs.com/kane0526/p/2791271.html