HDU-1753大明A+B【大数加算】
タイトルリンク:http://acm.hdu.edu.cn/showproblem.php?pid=1753
問題解決の考え方:
大数加算の問題ですが、2つの整数、1つの整数、1つの小数、2つの小数があります.
これは私たちがそれぞれの状況を単独で処理する必要があります.そして、この問題は余分な前導0と後導0がないことを保証する必要があります.最初は簡単だと思っていました.結局最後まで150行やった.悲劇.
この問題の巧みなやり方は、それぞれの状況を2つの小数に変換してやるということで、1つの状況しかありません.
コードは次のとおりです.
JAVAは超気軽に水を过ごします!!!150行と20行、鬱陶しいなぁ...
JAVA、あなたは強すぎます.ORZ
コードは次のとおりです.
問題解決の考え方:
大数加算の問題ですが、2つの整数、1つの整数、1つの小数、2つの小数があります.
これは私たちがそれぞれの状況を単独で処理する必要があります.そして、この問題は余分な前導0と後導0がないことを保証する必要があります.最初は簡単だと思っていました.結局最後まで150行やった.悲劇.
この問題の巧みなやり方は、それぞれの状況を2つの小数に変換してやるということで、1つの状況しかありません.
コードは次のとおりです.
#include<iostream>
#include<cmath>
#include<cstring>
#include<cstdio>
#include<algorithm>
using namespace std;
const int N = 810;
char a[N], b[N];
int c[N], d[N];
int main()
{
int flag1, flag2, len1, len2, pos;
int up, top, down;
while(scanf("%s %s", a, b) != EOF)
{
flag1 = flag2 = -1;
memset(c, 0, sizeof(c));
memset(d, 0, sizeof(d));
len1 = strlen(a); len2 = strlen(b);
for(int i = 0; i < len1; ++i) // 、
if(a[i] == '.') flag1 = i;
for(int i = 0; i < len2; ++i) // 、
if(b[i] == '.') flag2 = i;
if(flag1 == - 1 && flag2 == -1) //2
{
for(int i = len1 - 1, k = 0; i >= 0; --i)
c[k++] = a[i] - '0';
for(int i = len2 - 1, k = 0; i >= 0; --i)
d[k++] = b[i] - '0';
for(int i = 0, up = 0; i < N; ++i)
{
c[i] = c[i] + d[i] + up;
up = c[i] / 10;
c[i] %= 10;
}
for(top = N -1; !c[top] && top >= 0; --top);
if(top < 0)
{
printf("0
");
continue;
}
for(int i = top; i >= 0; --i)
printf("%d", c[i]);
printf("
");
}
else if(flag1 != -1 && flag2 != -1) //2
{
if(len1 - 1 - flag1 > len2 - 1 - flag2) //a
{
for(int i = 0; i < len1 - len2 + flag2 - flag1; ++i)
b[len2 + i] = '0';
b[len1 + flag2 - flag1 + 1] = '\0';
len2 += len1 - len2 + flag2 - flag1;
}
else if((len1 - 1 - flag1 < len2 - 1 - flag2))
{
for(int i = 0; i < len2 - len1 + flag1 - flag2; ++i)
a[len1 + i] = '0';
a[len2 + flag1 - flag2 + 1] = '\0';
len1 += len2 - len1 + flag1 - flag2;
}
pos = 0;
for(int i = len1 - 1; i >= 0; --i)
if(a[i] != '.') pos++;
else break;
for(int i = len1 - 1, k = 0; i >= 0; --i)
if(a[i] != '.')
c[k++] = a[i] - '0';
for(int i = len2 - 1, k = 0; i >= 0; --i)
if(b[i] != '.')
d[k++] = b[i] - '0';
for(int i = 0, up = 0; i < N; ++i)
{
c[i] = c[i] + d[i] + up;
up = c[i] / 10;
c[i] = c[i] % 10;
}
for(int i = 0; i < N; ++i)
a[i] = c[i] + '0';
for(top = N - 1; a[top] == '0'; --top); // 0
if(top < 0)
{
printf("0
");
continue;
}
for(down = 0; a[down] == '0' && down < pos; ++down); // 0
for(int i = top; i >= down; --i)
if(i == pos && down != pos) printf("%c.", a[i]);
else printf("%c", a[i]);
printf("
");
}
else //1 、1
{
if(flag1 == -1) //b
{
for(int i = len1 - 1, k = 0; i >= 0; --i)
c[k++] = a[i] - '0';
for(int i = flag2 - 1, k = 0; i >= 0; --i)
d[k++] = b[i] - '0';
for(int i = 0, up = 0; i < N; ++i)
{
c[i] = c[i] + d[i] + up;
up = c[i] / 10;
c[i] %= 10;
}
for(top = N - 1; !c[top]; --top); // 0
if(top < 0)
{
printf("0
");
continue;
}
for(down = len2 - 1; b[down] == '0'; --down); // 0
for(int i = top; i >= 0; --i)
printf("%d", c[i]);
if(b[down] != '.')
for(int i = flag2; i <= down; ++i)
printf("%c", b[i]);
printf("
");
}
else //a
{
for(int i = flag1 - 1, k = 0; i >= 0; --i)
c[k++] = a[i] - '0';
for(int i = len2 - 1, k = 0; i >= 0; --i)
d[k++] = b[i] - '0';
for(int i = 0, up = 0; i < N; ++i)
{
c[i] = c[i] + d[i] + up;
up = c[i] / 10;
c[i] %= 10;
}
for(top = N - 1; !c[top]; --top); // 0
if(top < 0)
{
printf("0
");
continue;
}
for(down = len1 - 1; a[down] == '0'; --down); // 0
for(int i = top; i >= 0; --i)
printf("%d", c[i]);
if(a[down] != '.')
for(int i = flag1; i <= down; ++i)
printf("%c", a[i]);
printf("
");
}
}
}
return 0;
}
JAVAは超気軽に水を过ごします!!!150行と20行、鬱陶しいなぁ...
JAVA、あなたは強すぎます.ORZ
コードは次のとおりです.
import java.math.BigDecimal;
import java.util.*;
public class Main
{
public static void main(String[] args)
{
BigDecimal a, b, c;
Scanner cin = new Scanner(System.in);
while(cin.hasNext())
{
a = cin.nextBigDecimal();
b = cin.nextBigDecimal();
c = a.add(b);
if(c.compareTo(BigDecimal.ZERO) == 0)
System.out.println("0");
else
System.out.println(c.stripTrailingZeros().toPlainString());
}
}
}