C/C++和JAVA 实现大数相加

HDU 1753 大明A+B

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1753

题目大意:  两个不超过400位的带小数的整数,求出透明的和,要求最简形式,即小数后面的后缀0不能输出。


首先是自己写的C++版AC代码,有些长,挺考验细节的

#include <iostream>
#include <cstdio>
#include <cstring>
using namespace std;
int maxq(int a, int b){
	return a > b ? a : b;
}
int main(){
	char a[410], b[410], xc[410], zc[410];
	int alen, blen, max, flag, k, kk, ad, bd, za, zb, xsa, xsb, zz, min, dd, gg;
	while(~scanf("%s %s", a+1, b+1)){
		flag = 0; gg = 1;
		alen = strlen(a+1);
		blen = strlen(b+1);
		if(alen == 3 && blen == 3 && a[1] == '0' && b[1] == '0' && a[2] == '.' && b[2] == '.' && a[3] == '0' && b[3] == '0')
		ad = alen + 1; bd = blen + 1;
		for(int i = 1; i <= alen; ++i)
			if(a[i] == '.'){ad = i; gg = 0; break;}
		if(gg) ad = alen+1;
		gg = 0;
		for(int i = 1; i <= blen; ++i)
			if(b[i] == '.'){bd = i; gg = 0; break;}
		if(gg) bd = blen+1;
		if(ad > alen){ za = alen; xsa = 0; }
		else {za = ad-1; xsa = alen - ad; }
		if(bd > blen){ zb = blen; xsb = 0; }
		else {zb = bd-1; xsb = blen - bd; }
		if(xsa > xsb) { max = alen; min = blen; flag = 1; zz = ad; dd = xsa; xc[xsa+1] = '\0'; k = xsa - xsb;}
		else {max = blen; min = alen; zz = bd; dd = xsb; xc[xsb+1] = '\0'; k = xsb - xsa;}
		while(k--){
			if(flag) xc[dd--] = a[max--];
				else xc[dd--] = b[max--];
		}
		k = 0;
		for( ; max > zz; --max, --min, --dd){
			if(flag){
				if(k){ 
					kk = (a[max]-'0') + (b[min]-'0') + 1;
					if(kk > 9){ k = 1; xc[dd] = '0' + (kk - 10);}
					else {k = 0; xc[dd] = '0' + kk;}
				}
				else {
					kk = (a[max]-'0') + (b[min]-'0');
					if(kk > 9){ k = 1; xc[dd] = '0' + (kk - 10);}
					else {k = 0; xc[dd] = '0' + kk;}
				}
			}
			else {
				if(k){ 
					kk = (b[max]-'0') + (a[min]-'0') + 1;
					if(kk > 9){ k = 1; xc[dd] = '0' + (kk - 10);}
					else {k = 0; xc[dd] = '0' + kk;}
				}
				else {
					kk = (b[max]-'0') + (a[min]-'0');
					if(kk > 9){ k = 1; xc[dd] = '0' + (kk - 10);}
					else {k = 0; xc[dd] = '0' + kk;}
				}
			}
		}
		flag = 0;
		max--; min--;
		if(za > zb){max = za; flag = 1;}
		else {max = zb;}
		min = max ^ za ^ zb;
		zc[max+1] = '\0';
		for(int i = max, j = min; i >= 1; --i, --j){
			min--;
			if(min >= 0)
				if(flag)
					if(k){ 
						kk = (a[i]-'0') + (b[j]-'0') + 1;
						if(kk > 9){ k = 1; zc[i] = '0' + (kk - 10);}
						else {k = 0; zc[i] = '0' + kk;}
					}
					else {
						kk = (b[j]-'0') + (a[i]-'0');
						if(kk > 9){ k = 1; zc[i] = '0' + (kk - 10);}
						else {k = 0; zc[i] = '0' + kk;}
					}
				else
					if(k){ 
						kk = (b[i]-'0') + (a[j]-'0') + 1;
						if(kk > 9){ k = 1; zc[i] = '0' + (kk - 10);}
						else {k = 0; zc[i] = '0' + kk;}
					}
					else {
						kk = (b[i]-'0') + (a[j]-'0');
						if(kk > 9){ k = 1; zc[i] = '0' + (kk - 10);}
						else {k = 0; zc[i] = '0' + kk;}
					}
			else
				if(flag){
					if(k){ 
						kk = (a[i]-'0') + 1;
						if(kk > 9){ k = 1; zc[i] = '0' + (kk - 10);}
						else {k = 0; zc[i] = '0' + kk;}
					}
					else  zc[i] = a[i];
				}
				else{
					if(k){ 
						kk = (b[i]-'0') + 1;
						if(kk > 9){ k = 1; zc[i] = '0' + (kk - 10);}
						else {k = 0; zc[i] = '0' + kk;}
					}
					else  zc[i] = b[i];
				}
		}
		if(xsa > xsb) max = xsa; else max = xsb;
		for(int i = max; i >= 1; --i)
			if(xc[i] == '0'){xc[i] = '\0';}
			else break;
		if(xc[1] == '\0' || maxq(xsa, xsb) == 0){
			if(k) printf("1");
			printf("%s\n", zc+1);
		}
		else{
			if(k) printf("1");
			printf("%s.%s\n", zc+1, xc+1);
		}
	}
	return 0;
}


接下来是JAVA实现的代码,很

import java.math.BigDecimal;  
import java.util.*;  
public class Main {  
    public static void main(String[] args) {  
        Scanner cin = new Scanner(System.in);  
        BigDecimal a , b;  
        while(cin.hasNext()){  
            a = cin.nextBigDecimal();  
            b = cin.nextBigDecimal();  
            System.out.println(a.add(b).stripTrailingZeros().toPlainString());  
        }  
    }  
}  

以上两种代码都可以实现这题的功能以及AC~






评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值