nyoj513 A+B Problem IV

A+B Problem IV

时间限制: 1000 ms  |  内存限制: 65535 KB
难度: 3
描述
acmj最近发现在使用计算器计算高精度的大数加法时很不方便,于是他想着能不能写个程序把这个问题给解决了。
输入
包含多组测试数据
每组数据包含两个正数A,B(可能为小数且位数不大于400)
输出
每组输出数据占一行,输出A+B的结果,结果需要是最简的形式。
样例输入
1.9 0.1
0.1 0.9
1.23 2.1
3 4.0
样例输出
2
1
3.33

7


原题地址:http://acm.nyist.net/JudgeOnline/problem.php?pid=513

这题思路很好想,但细节太多尤其是小数点的问题,处理不好就容易出错

//思路:定义两个800的数组分别储存两个数,以400 401为界分成小数点前后两部分,进行逐位运算 

#include <stdio.h>
#include <string.h>
char a[410],b[410];
int main()
{
	while(~scanf("%s %s",a,b))
	{
		int i,j,k=0,ba=0,bb=0;
		int a1[810] = {0};
		int b1[810] = {0};
		int la = strlen(a),lb = strlen(b);//A B 的长度 
		for(i=1;i<la;i++ )
		if(a[i] == '.') //小数点位置 
		{
			ba=i;
			break;
		}
		if(ba != 0)  //有小数点 
		{
			k=400;
			for(i=ba-1;i>=0;i--)
			{
				a1[k--] = a[i] - '0';
			}
			k = 401;
			for(i=ba+1;i<la;i++)
			{
				a1[k++] = a[i] - '0';
			}
		}
		else   //没有小数点 
		{
			k=400;
			for(i=la-1;i>=0;i--)
			{
				a1[k--] = a[i] - '0';
			}
		}
		
		for(i=1;i<lb;i++ ) //方法同A 
		if(b[i] == '.')
		{
			bb=i;
			break;
		}
		if(bb != 0)
		{
			k=400;
			for(i=bb-1;i>=0;i--)
			{
				b1[k--] = b[i] - '0';
			}
			k = 401;
			for(i=bb+1;i<lb;i++)
			{
				b1[k++] = b[i] - '0';
			}
		}
		else
		{
			k=400;
			for(i=lb-1;i>=0;i--)
			{
				b1[k--] = b[i] - '0';
			}
		}
		int t=0;
		for(i = 800;i >= 0;i -- )  //逆序对每一位加减 (正序存入的) 
		{
			a1[i] = a1[i] + b1[i] + t;
			t = a1[i] / 10;
			a1[i] = a1[i] % 10;
		}
		for(i=0;i<401 && a1[i] == 0 ;i ++ ); //查找输出入口 
		if(i == 401)  //整数全为0,输出0 
			printf("0");
		for(;i<401;i ++ )
			printf("%d",a1[i]);
		for(i=800;i>400 && a1[i] ==0 ;i--);
		if(i != 400)  //小数部分不全为零输出小数点 
			printf(".");
		for(j=401;j<=i;j++)  //输出小数部分 
			printf("%d",a1[j]);
		printf("\n");
	}
	return 0;
}



//分开存(更麻烦) 

#include <stdio.h>
#include <string.h>
int main()
{
	char a[410],b[410];
	while( ~scanf("%s %s",a,b) )
	{
		int la = strlen(a);
		int lb = strlen(b);
		int bit1=la,bit2=lb,i,j=0,k=0,fa=1,fb=1;
		int a1[410] = {0},a2[410] = {0};
		int b1[410] = {0},b2[410] = {0};
		for(i=la-1;i>=0;i--)
		if(a[i]=='.')
		{
			bit1=i;
			break;
		}
		for(i=bit1-1;i>=0;i--)
		{
			a1[j++] = a[i] - '0';
		}
		if(bit1!=la)
		for(i=bit1+1;i<la;i++)
		{
			a2[k++] = a[i] - '0';
		}
			
		j=k=0;
		for(i=lb-1;i>=0;i--)
		if(b[i]=='.')
		{
			bit2=i;
			break;
		}
		for(i=bit2-1;i>=0;i--)
		{
			
			b1[j++] = b[i] - '0';
				
		}
		for(i=bit2+1;i<lb;i++)
		{
			b2[k++] = b[i] - '0';
		}
		int s,t=0;
		for(i=0;i<401;i++)
		{
			s = a1[i]+b1[i]+t;
			a1[i] = s%10;
			t = s/10;
		}
		t=0;
		for(i=400;i>=0;i--)
		{
			s = a2[i]+b2[i]+t;
			a2[i] = s%10;
			t = s/10; 
		}
		a1[0]+=t;
		for(i=0;i<401;i++)
		if(a1[i]>9) 
		{
			a1[i]%=10;
			a1[i+1]+=1;
		}
		for(j=400;j>=0 && a1[j]==0;j--);
		if(j == -1)printf("0");
		for(i=j;i>=0;i--)
			printf("%d",a1[i]);
		for(j=400;j>=0 && a2[j]==0;j--);
		if(j != -1) printf(".");
		for(i=0;i<=j;i++)
			printf("%d",a2[i]);
		printf("\n");
	}
	return 0;
}

import java.util.Scanner;
import java.math.*;
public class Main {

	public static void main(String[] args) {
		Scanner in = new Scanner(System.in);
		BigDecimal d1, d2, temp = new BigDecimal("0.0");
		while(in.hasNextBigDecimal()){
			d1 = in.nextBigDecimal();
			d2 = in.nextBigDecimal();
			d1 = d1.add(d2);
			String s = d1.stripTrailingZeros().toPlainString();	//将结果去除小数点后面多余的零之后转换为字符串的形式 
			if(d1.compareTo(temp) == 0){	//特殊情况答案是0的时候 
				System.out.println("0");
			}else{
				System.out.println(s);
			}
		}
		in.close();
	}
} 



  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值