JAVAブルーブリッジカップ:高精度アルゴリズム
問題の説明
問題は、2つの整数aおよびbを入力し、この2つの整数の和を出力することを示す.aもbも100位を超えない.アルゴリズム記述は、aおよびbが比較的大きいため、言語内の標準データ型を直接使用して格納することはできない.この問題については,一般に配列を用いて処理される.配列Aを定義し、A[0]はaのビットを格納し、A[1]はaの10ビットを格納する.同様に、bを1つの配列Bで格納することができる.c=a+bを計算するときは、まずA[0]とB[0]を加算し、キャリーが発生した場合は、キャリー(すなわち和の10桁)をrに格納し、和の桁数をC[0]に格納する.すなわち、C[0]は(A[0]+B[0])%10に等しい.その後、A[1]とB[1]を加算すると、下位ビットから上がった値rも加算される.すなわち、C[1]はA[1]、B[1]、rの3つの数の和であるべきである.また、キャリーが発生した場合でも、新しいキャリーをrに格納し、和のビットをC[1]に格納することができる.このようにすれば,Cのすべてのビットを求めることができる.最後にCを出力すればよい.入力フォーマット入力は、2行を含み、第1の動作は非負の整数a、第2の動作は非負の整数bである.2つの整数はいずれも100ビットを超えず、2つの数の最高位は0ではありません.出力フォーマットは、a+bの値を表す行を出力します.サンプル入力201012220101221234567890 20101222010122サンプル出力20101222030011233454668012
コードは次のとおりです.
問題は、2つの整数aおよびbを入力し、この2つの整数の和を出力することを示す.aもbも100位を超えない.アルゴリズム記述は、aおよびbが比較的大きいため、言語内の標準データ型を直接使用して格納することはできない.この問題については,一般に配列を用いて処理される.配列Aを定義し、A[0]はaのビットを格納し、A[1]はaの10ビットを格納する.同様に、bを1つの配列Bで格納することができる.c=a+bを計算するときは、まずA[0]とB[0]を加算し、キャリーが発生した場合は、キャリー(すなわち和の10桁)をrに格納し、和の桁数をC[0]に格納する.すなわち、C[0]は(A[0]+B[0])%10に等しい.その後、A[1]とB[1]を加算すると、下位ビットから上がった値rも加算される.すなわち、C[1]はA[1]、B[1]、rの3つの数の和であるべきである.また、キャリーが発生した場合でも、新しいキャリーをrに格納し、和のビットをC[1]に格納することができる.このようにすれば,Cのすべてのビットを求めることができる.最後にCを出力すればよい.入力フォーマット入力は、2行を含み、第1の動作は非負の整数a、第2の動作は非負の整数bである.2つの整数はいずれも100ビットを超えず、2つの数の最高位は0ではありません.出力フォーマットは、a+bの値を表す行を出力します.サンプル入力201012220101221234567890 20101222010122サンプル出力20101222030011233454668012
コードは次のとおりです.
import java.io.*;
public class Main {
public static void main(String[] args)throws IOException {
BufferedReader bufferedReader=new BufferedReader(new InputStreamReader(System.in));
String num1 = bufferedReader.readLine();
String num2 = bufferedReader.readLine();
int[] num1_int=new int[100000];
int[] num2_int=new int[100000];
int length=Math.min(num1.length(), num2.length());
int length_max=Math.max(num1.length(), num2.length());
int[] num_total=new int[length_max];
for(int i=0;i1-i]=Character.getNumericValue(num1.charAt(i));
}
for(int i=0;i1-i]=Character.getNumericValue(num2.charAt(i));
}
for(int i=0;ifor(int i=0;i1;i++){
if(num_total[i]>9){
num_total[i]=num_total[i]%10;
num_total[i+1]=num_total[i+1]+1;
}
}
for(int i=num_total.length-1;i>=0;i--){
System.out.print(num_total[i]);
}
}
}