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~