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