【HDU 1753 大明A+B】 高精度加法
2012-11-27 18:19
363 查看
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1753
题目大意: 给你两个不超过400位的带小数的整数,求出透明的和,要求小数后面的后缀0不能输出。
解题思路:
题目很简单,思路也比较清晰。
不难,但就是要注意的地方很多。 小数点后面的位数可以直接相加,小数点前面的按末尾相加(和小数点后相加不同)。
1.注意小数点的进位,如果0位(大于10)还要继续进位,大于10则取余后将tmp2记为1,不大于10则tmp2记为0,小数点前的第一位加tmp2。我就是先进完位再加tmp2错了几次。
2.输出的时候判断.要不要输出。
测试样例在代码最后,过了这个基本就能过吧。。
题目大意: 给你两个不超过400位的带小数的整数,求出透明的和,要求小数后面的后缀0不能输出。
解题思路:
题目很简单,思路也比较清晰。
不难,但就是要注意的地方很多。 小数点后面的位数可以直接相加,小数点前面的按末尾相加(和小数点后相加不同)。
1.注意小数点的进位,如果0位(大于10)还要继续进位,大于10则取余后将tmp2记为1,不大于10则tmp2记为0,小数点前的第一位加tmp2。我就是先进完位再加tmp2错了几次。
2.输出的时候判断.要不要输出。
测试样例在代码最后,过了这个基本就能过吧。。
#include <iostream> //1753 #include <cstdio> #include <algorithm> #include <cstring> using namespace std; char s1[500], s2[500]; int a[500], a2[500], b[500]; int lena, lenb, tmp1, tmp2, st1, st2, d2; void cal() { int i, j, c=0; st1=0, st2=0; for(i=0; i<lena; i++) { if(s1[i]!='.') a[i]+=s1[i]-'0'; else { st1=max(st1,i-1); break; } } if(i==lena) st1=lena-1; for(j=i+1; j<lena; j++) b[j-i-1]+=s1[j]-'0'; for(i=0; i<lenb; i++) { if(s2[i]!='.') a2[i]+=s2[i]-'0'; else { st2=max(st2,i-1); break; } } if(i==lenb) st2=lenb-1; for(j=i+1; j<lenb; j++) b[j-i-1]+=s2[j]-'0'; if(st1>=st2) c=1; if(c==1) { for(i=st1, j=st2; j>=0; i--,j--) a[i]+=a2[j]; } else { for(i=st1, j=st2; i>=0; i--,j--) a2[j]+=a[i]; for(i=st2; i>=0; i--) a[i]=a2[i]; } st1=max(st1,st2); } void add() { tmp1=0, tmp2=0; int i, j; for(i=499; i>=0; i--) if(b[i]!=0) break; for(j=i; j>=0; j--) { if(b[j]>=10&&j!=0) { b[j-1]+=1; b[j]%=10; } else if(b[j]>=10&&j==0) { b[j]%=10; tmp2=1; } } a[st1]+=tmp2; for(j=st1; j>=1; j--) { if(a[j]>=10) { a[j-1]+=1; a[j]%=10; } } } void output() { int flag=0, i, j; for(i=499; i>=0; i--) if(b[i]!=0) { d2=i; flag=1; break; } if(flag) { for(i=0; i<=st1; i++) printf("%d",a[i]); printf("."); for(j=0; j<=d2; j++) printf("%d",b[j]); puts(""); } else { for(i=0; i<=st1; i++) printf("%d",a[i]); puts(""); } } int main() { while(~scanf("%s%s",s1,s2)) { memset(a,0,sizeof(a)); memset(a2,0,sizeof(a2)); memset(b,0,sizeof(b)); lena=strlen(s1); lenb=strlen(s2); cal(); add(); output(); } return 0; } /* 99999.889 0.111 1000.0 10000.0 112233.1 333.9 123450000 777 123400000 777.700 0.000 0.0000 99999 1 1.2333 20.2667 1212121212.1111111 21212121.33300000000000000 */
相关文章推荐
- hdu 1753 Java 高精度处理 大明A+B
- hdu 1753 大明A+B(高精度小数加法)
- hdu 1753 大明A+B(高精度小数加法)
- HDU-1753 实数高精度加法
- Hdu 1753 大明A+B <高精度小数相加>
- HDU 1753 大明A+B 大型小数
- HDU - 1753 - 大明A+B(高精度)
- HDU-高精度小数加法-最大400位
- hdu 1753(大数——加法)
- HDU 1715 大斐波数 加法高精度
- hdu 1753 大明A+B
- hdu 1002 高精度加法
- HDU 1753 大明A+B(大数加法,数组模拟)
- HDU 1753 大明A+B
- hdu - 1753 - 大明A+B (java高精度BigDecimal)
- HDU 1753 大明A+B -- java大法好
- HDU 1753 大明A+B(高精度浮点数运算)
- Hdu-1002(高精度加法_java)
- HDU-1047 高精度加法
- hdu 1002 高精度加法