您的位置:首页 > 其它

hdu 1753大小数相加

2017-02-06 10:58 176 查看
传送门: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.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
*/
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: