私はここと同じ質問に対して正しい解決策を見つけようとしています が、Javaで、カウントが返されることになっているので少し変更しました。
私は次の解決策を思いついた:
public static int count(int n) {
// check for 0 or smaller
if (n <= 0) {
return -1;
}
// find root of N
int root = (int) Math.ceil(Math.sqrt(n));
int count = 0;
for (int i = 1; i < root; i++) {
if (n % i == 0) {
// calculate bit_rev(i)
int reverse = bit_rev(i);
// calculate bit_rev(N/i)
int reverseDiv = bit_rev((int)Math.floor(n/i));
// check whether i * bit_rev(i) == N or i == bit_rev(N/i)
if (reverse*i == n
|| i == reverseDiv) {
System.out.println(String.format("Found reverse (N = %d, i = %d, bit_rev(i) = %d, bit_rev(i) * i = %d, bit_rev(N/i) = %d)", n, i, reverse, reverse*i, reverseDiv));
count++;
} else {
System.out.println(String.format("N = %d mod i = %d == 0, but no match (bit_rev(i) = %d, bit_rev(i) * i = %d, bit_rev(N/i) = %d)", n, i, reverse, reverse*i, reverseDiv));
}
}
}
if (count == 0) {
// didn't match -> return -1
return -1;
} else {
// return whatever the count was
return count;
}
}
public static int bit_rev(int n) {
String string = Integer.toBinaryString(n);
String reverseString = new StringBuffer(string).reverse().toString();
int reverse = Integer.parseInt(reverseString, 2);
return reverse;
}
参照サンプルでは、N=3245の解はcount=55であると想定されています。
しかし、私の解決策はそれを見つけますcount = 1 (i = 55, bit_rev(i) = 59).
その他の参照サンプルは次のとおりです。
-) N = 50 -> count = 1
-) N = 286 -> count = 2
bit_rev()を見つけるための解決策が最高(最も効率的な解決策)ではないことは理解していますが、それは間違っているとは思いませんね。
ここに他の間違いがありますか、それともN = 3245の参照サンプルが間違っていますか?