私はjavaのSRM 144 DIV 1から問題を解決しています。私のコードはすべてのテストケースで動作しますが、値が "12221112222221112221111111112221111" のテストケースがあります。これはjavaのデータ型の制限を超えていることがわかりました。トップコーダーで大きな入力サイズのJavaプログラムを解決する
これを解決する方法があります。 ここに私のコードのサンプルです。
public class BinaryCode{
public String[] decode(String message){
int mess = Integer.parseInt(message);
int encmess[] = new int[message.length()];
for(int i = message.length()-1;i>=0;i--){
encmess[i] = mess%10;
mess = mess/10;
}
int[] decmess1 = new int[message.length()];
int[] decmess2 = new int[message.length()];
decmess1[0] = 0;
decmess2[0] = 1;
String mess1 = "";
String mess2 = "";
for(int i = 1;i<decmess1.length;i++){
if(i == 1){
decmess1[i] = encmess[i-1] - decmess1[i-1];
}
else{
decmess1[i] = encmess[i-1] - decmess1[i-1] - decmess1[i-2];
}
if(decmess1[i]>1||decmess1[i]<0){
mess1 = "NONE";
break;
}
}
for(int i = 1;i<decmess2.length;i++){
if(i == 1){
decmess2[i] = encmess[i-1] - decmess2[i-1];
}
else{
decmess2[i] = encmess[i-1] - decmess2[i-1] - decmess2[i-2];
}
if(decmess2[i]>1||decmess2[i]<0){
mess2 = "NONE";
break;
}
}
int num1 = 0;
int num2 = 0;
if(!mess1.equals("NONE")){
for(int i = 0;i<decmess2.length;i++){
num1 = num1*10 + decmess1[i];
}
}
if(!mess2.equals("NONE")){
for(int i = 0;i<decmess2.length;i++){
num2 = num2*10 + decmess2[i];
}
}
if(!mess1.equals("NONE"))
mess1 = "0"+Integer.toString(num1);
if(!mess2.equals("NONE"))
mess2 = Integer.toString(num2);
String[] result = {mess1,mess2};
return result;
}
}
を得る。しかし、その後、私は間の算術演算を行うことができるとは思いませんBigIntegerとintはエラーが発生するためです。 –
BigIntegerクラスで算術演算を行うメソッドがあります。例えば'' + ''の代わりに '' add() ''メソッドを使う必要があります。 – muzahidbechara
それはうまくいきましたが、間違った結果が出ます。 –