HDU OJ 1002 A+B 問題 Dashu バージョン
大数加算バージョン A+B この問題の A と B は 2,000 桁まで加算できます。この場合、純粋な C スタイルと JAVA スタイルのコードを使用して問題を解決します。
1002 A+B 問題の質問
質問
とても簡単な問題があります。2 つの整数 A と B が与えられた場合、あなたの仕事は A + B の合計を計算することです。入力
入力
の最初の行には、テスト ケースの数を意味する整数 T(1<=T<=20) が含まれています。次に T 行が続き、各行は 2 つの正の整数 A と B で構成されます。整数は非常に大きいことに注意してください。つまり、32 ビット整数を使用して整数を処理すべきではありません。各整数の長さは 1000 を超えないと想定できます。
出力
テスト ケースごとに 2 行を出力する必要があります。1行目は「Case #:」で、#はテストケースの番号を意味します。2 行目は方程式「A + B = Sum」です。Sum は A + B の結果を意味します。方程式にはスペースがいくつかあることに注意してください。2 つのテスト ケースの間に空行を出力します。
サンプル入力
2
1 2
112233445566778899 998877665544332211
出力例
case1:
1 + 2 = 3
ケース2:
112233445566778899 + 998877665544332211 = 1111111111111111110
1002 A+B PROBLEM C 言語の問題解決のアイデア
- a と b は非常に大きく、最大 1000 桁を含めることができるため、整数型または長整数型を使用して格納することはできません。そのため、a と b は最初に 2 つの文字列に格納されます。
- 次に、a と b の長さを取得し、a と b のいずれかの文字列の長さが 0 になるまで、結果の文字列の最後の桁から順に追加します。
- 長い方の文字列の追加されていない部分を結果文字列の末尾にコピーします。2 つの長さが同じで最後の桁が 0 でない場合は、出力を容易にするために 1 桁追加します。
- 結果文字列を後ろから前へ順番に出力します
- 最後の Case ではない場合は、改行を出力します。
1002 A+B 問題 C 言語のバージョンをコーディングする
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
//HDU OJ 1002 A+B PROBLEM
//使用字符串储存a串和b串 题目可知最多一千位 故申请1005个字符空间
char a[1005],b[1005];
//使用整型数组储存结果串 更方便处理
//此时 两个一千位数相加位数不可能超过1001位 全部初始化为0
int res[1005]= {
0};
//使用la和lb来储存a串与b串的大数
int la=0,lb=0;
//使用p来存储结果的位数
int p = 0;
int flag = 0;
void sum(char a[1005],char b[1005])
{
la = strlen(a);
lb = strlen(b);
p = 0;
//使用memset函数填充res数组
memset(res,0,sizeof(res));
int j=la-1;
int k=lb-1;
//逆序相加 先加 a串b串中最后的数 结果顺序存入res中 直到a的未运算的长度为0 或者 b的未运算的长度为0
while(j>=0&&k>=0)
{
//如果res[p]和a,b最后一个未加的位数相加大于10 则res[p+1]的数+1 进一位
if(res[p]+(a[j]-'0')+(b[k]-'0')>=10)
{
res[p]=res[p]+(a[j]-'0')+(b[k]-'0')-10;
res[p+1]++;
}
//如果res[p]和a,b最后一个未加的位数相加不大于10 则不会进一位
else
{
res[p]=res[p]+(a[j]-'0')+(b[k]-'0');
}
//res已经运算的位数+1 j a的未做运算的位数-1 k b的未做运算的位数-1
p++;
j--;
k--;
}
//如果此时j等于或者大于0 则表明a串位数大于b串 则把a串剩下的位数加到res中 反正 则把b串剩下的位数加到res中
//如果 j 和 k 都小于0 则 查看res[p]是不是不是0 如果不是0 则res的位数p+1;
if(j>=0)
{
for(int t=j; t>=0; t--)
{
res[p]=res[p]+(a[t]-'0');
p++;
}
}
else if(k>=0)
{
for(int t=k; t>=0; t--)
{
res[p]=res[p]+(b[t]-'0');
p++;
}
}
else if(res[p]!=0)
{
p++;
}
}
int main()
{
int n;
scanf("%d",&n);
for(int i = 1 ; i <= n ; i ++ )
{
scanf("%s%s",a,b);
sum(a,b);
printf("Case %d:\n",i);
printf("%s + %s = ",a,b);
//从p-1位向后 逆序输出
for(int t=p-1; t>=0; t--)
{
printf("%d",res[t]);
}
printf("\n");
if(i!=n){
printf("\n");
}
}
return 0;
}
プログラムの実行結果は図のようになります
1002 A+B PROBLEM JAVA 言語の問題解決アイデア
- a と b は最大 1000 桁と非常に大きいため、整数型または長整数型を使用して保存することはできません。
- JAVA では、大きな数値には整数 BigInteger が、大きな数値には 10 進数 BigDecimal が用意されており、この問題は BigInteger を使用して解決するのに適しています。
- Scanner.nextBigInteger() を使用して、コンソールから入力された大きな数値を受け入れます。
- BigDecimal.add() メソッドを使用して 2 つの数値を加算します
- BigDecimal.toString() メソッドを使用して大きな数値を出力する
- 最後の Case ではない場合は、改行を出力します。
1002 A+B 問題コード Java 言語のバージョン
import java.math.*;
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
BigInteger a, b;
Scanner sc = new Scanner(System.in);
int n;
n = sc.nextInt();
for (int i = 1; i <= n; i++) {
a = sc.nextBigInteger();
b = sc.nextBigInteger();
System.out.println("Case " + i);
System.out.println(a.toString() + " + " + b.toString() + " = " + a.add(b).toString());
if(i!=n){
System.out.println("");
}
}
sc.close();
}
}