hdu 1753大小数相加
来源:互联网 发布:ip网络寻呼话筒怎么用 编辑:程序博客网 时间:2024/06/16 23:34
传送门:http://acm.hdu.edu.cn/showproblem.php?pid=1753
最简小数是小于 1 的数的整数部分需要去掉?
import java.math.BigInteger;import java.util.Scanner;import java.math.BigDecimal;public class Main{public static void main(String args[]){Scanner in = new Scanner(System.in);while(in.hasNext()){ BigDecimal a = in.nextBigDecimal();BigDecimal b = in.nextBigDecimal();String ans = a.add(b).stripTrailingZeros().toPlainString(); if(ans.startsWith("0")) //去掉前导0{ans = ans.substring(1);}System.out.println(ans);}}}
还有这个stripTrailZero()对String和大数类都奏效可以用
C/C++版本:
/*小数点后面的位数可以直接相加,小数点前面的按末尾相加(和小数点后相加不同)。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.1111000.0 10000.0112233.1 333.9123450000 777123400000 777.7000.000 0.000099999 11.2333 20.26671212121212.1111111 21212121.33300000000000000*/
0 0
- hdu 1753大小数相加
- hdu1753(大小数相加)
- HDU(2057)十六进制数相加
- hdu 2141 二分查找,三个数相加
- hdu 1753 高精度小数相加
- hdu 1753 java 小数相加
- HDU-1753 大明A+B【大数相加】
- HDU-1753 大明A+B【大数相加】
- HDU 1753 小数的大数相加
- hdu 1753 大数相加(高精度)
- HDU-1753 大明A+B【大数相加】
- 超大数相加减
- 三个数相加
- 单链表中的数相加
- 两数相加问题
- 两个数反转相加
- 四数相加
- 算法:两数相加
- 不能创建抽象基类的对象
- 2016年度最热门的开发工具
- 如何去掉ul和li前面的小黑点
- 进程创建与相关函数等知识点总结
- C/C++中函数调用规则(约定)__cdecl __stdcall __thiscall __vectorcall __fastcall __clrcall
- hdu 1753大小数相加
- js之事件冒泡和事件捕获详细介绍
- [FAQ13697]L 版本如何将第三方so库打包到apk
- H5页面缓存详解
- js确定与取消按钮
- Orm框架介绍和常见的Android Orm框架
- python学习资源
- 数据仓库之四部"圣经"
- Servlet基础(转) Servlet的多线程同步问题