1. トピックの説明
ベッシーが数値を新しい基数に変換し、その結果を書き留めるときは、いつも桁の 1 つを間違えていました。
たとえば、数値 14 を 2 進数に変換した場合、正しい結果は 1110 になりますが、0110 または 1111 と書き込む可能性があります。
Bessie は、数字を追加したり削除したりすることはありませんが、数字の入力ミスにより、先頭に 0 を含む数字を書き込む場合があります。
Bessie による数値 N の 2 進数および 3 進数への変換の結果を考慮して、N の正しい初期値 (10 進数表現) を決定します。
入力フォーマット
最初の行には N のバイナリ表現が含まれていますが、そのうちの 1 つが間違っています。
2 行目には N の 3 項表現が含まれていますが、そのうちの 1 つが間違っています。
出力フォーマット
正しい N 値を出力します。
データ範囲
N は 109 を超えてはなりません。独自の解決策があります。
入力サンプル
1010
212
出力サンプル
14
2.思考分析
考えられるすべての数値を 2 進数で計算し、保存するという非常に単純なアイデアがあります。
次に、考えられるすべての数値を 3 進法で計算し、保存します。
2 つの交点、つまり共通する数字が正解でなければなりません。
まず、バイナリの各ビットに対応する数値を列挙して変更し、直接 XOR して否定する必要があります。
次に、Qin Jiushao アルゴリズムに従って XOR 結果を 10 進数に変換し、ハッシュ配列に保存します。
最後に、3進法の各桁に対応する数値を変更して10進法に変換し、ハッシュ配列に存在するかどうかを判定します
3. Qin Jiushao アルゴリズム
Qin Jiushao のアルゴリズムは、多項式を計算できるため、10 進数に変換するための非常に効率的なアルゴリズムです。他の基数から 10 進数への変換に使用されます。
4.ACコード
import java.io.*;
import java.util.HashSet;
public class Main {
public static void main(String[] args) throws IOException {
BufferedReader br=new BufferedReader(new InputStreamReader(System.in));
String s1=br.readLine();
String s2=br.readLine();
//转换成字符数组,字符串无法异或
char []c1=s1.toCharArray();
char []c2=s2.toCharArray();
HashSet<Integer> hs=new HashSet<>();
for (int i = 0; i < c1.length; i++) {
//将每位数字异或取相反数字
c1[i]^=1;
//转换为10进制数后添加到哈希表中
hs.add( change(c1,2));
//然后转换回来,方便下一位转换
c1[i]^=1;
}
for (int i = 0; i < c2.length; i++) {
char t=c2[i];
for(char j='0';j<'3';j++){
//如果c本位等于当前的值则跳过继续,因为必定会错一位
if(c2[i]==j) continue;
//如果不是则赋j值
c2[i]=j;
if(hs.contains(change(c2,3))){
System.out.println(change(c2,3));
return;
}
c2[i]=t;
}
}
}
//根据秦九韶算法将其他进制转换为10进制数
private static Integer change(char c[], int t) {
int re=0;
for (int i = 0; i < c.length; i++) {
re=re*t+c[i]-'0';
}
return re;
}
}
読んでいただきありがとうございます。間違いがあればコメントして修正してください。良いアイデアがあれば交換してください。役に立った場合は、いいねとサポートをお願いします。