找到转换为基数 10 时相等的两个基数
Finding Two Bases Which When Converted to Base 10 Are Equal
今天我遇到了一个非常具有挑战性的问题。想不出办法解决。
给定 6 个数字作为输入:a1、a2、a3、b1、b2、b3,找到 2 个数字 X 和 Y,满足 a1 * x^2 + a2 ^ x + a3 = b1 * y^2 + b2 * y + b3。 X 和 Y 必须介于 10 和 15000 之间(含)。
我尝试过的:
我已经尝试了 10-15000 的所有 X 值和 10-15000 的所有 Y 值,并检查它们是否满足等式。但是,这种方法非常慢。有人有更快的解决方案吗?谢谢
我的错误代码:
for (int i = 0; i < k; i++) {
int a, b;
cin >> a >> b;
for (int i = 10; i <= 15000; i++) {
for (int j = 10; j <= 15000; j++) {
if (conv(a, i) == conv(b, j)) {
cout << i << " " << j << endl;
j = 20000;
i = 20000;
}
}
}
}
long long conv(int x, int b) {
long long ans = 0;
int count = 0;
while (x) {
int y = x % 10;
ans += y * poww(b, count);
count++;
x /= 10;
}
return ans;
}
long long poww(int x, int y) {
long long ans = 1;
while (y != 0) {
ans *= x;
y--;
}
return ans;
}
我认为这可能是练习编写一些 Java 代码的好机会,并提出了以下解决方案。在我的系统上,它在 1 毫秒内给出了两个数字 419 和 792 的解决方案(正如您在之前对问题的编辑中所写,结果应该是 Base X: 47 Base Y: 35)。
代码只是使用了一些智能暴力:)。
public class TwoBases {
public static void main(String[] args) {
long beg = System.nanoTime();
solve(419, 792);
System.out.println("Time needed to calculate: "+(System.nanoTime()-beg)/1000000.0 + "ms");
}
public static void solve(int a, int b) {
int[] aDigits = new int[3];
int[] bDigits = new int[3];
for (int i = 0; i < 3; i++) {
aDigits[2 - i] = (a / (int) Math.pow(10, i)) % 10;
bDigits[2 - i] = (b / (int) Math.pow(10, i)) % 10;
}
for (int x = 10; x <= 15000; x++) {
int numBaseX = digitsToBase10(aDigits, x);
int y = 10;
while (y <= 15000) {
int numBaseY = digitsToBase10(bDigits, y);
if (numBaseX == numBaseY) {
System.out.println("Base X: " + x + " Base Y: " + y);
return;
} else if (numBaseY > numBaseX) {
break;
} else {
y++;
}
}
}
System.out.println("Nothing found");
}
public static int digitsToBase10(int[] digits, int b) {
int res = 0;
for (int i = 0; i < digits.length; i++) {
res += digits[i] * (int) Math.pow(b, digits.length - 1 - i);
}
return res;
}
}
今天我遇到了一个非常具有挑战性的问题。想不出办法解决。
给定 6 个数字作为输入:a1、a2、a3、b1、b2、b3,找到 2 个数字 X 和 Y,满足 a1 * x^2 + a2 ^ x + a3 = b1 * y^2 + b2 * y + b3。 X 和 Y 必须介于 10 和 15000 之间(含)。
我尝试过的:
我已经尝试了 10-15000 的所有 X 值和 10-15000 的所有 Y 值,并检查它们是否满足等式。但是,这种方法非常慢。有人有更快的解决方案吗?谢谢
我的错误代码:
for (int i = 0; i < k; i++) {
int a, b;
cin >> a >> b;
for (int i = 10; i <= 15000; i++) {
for (int j = 10; j <= 15000; j++) {
if (conv(a, i) == conv(b, j)) {
cout << i << " " << j << endl;
j = 20000;
i = 20000;
}
}
}
}
long long conv(int x, int b) {
long long ans = 0;
int count = 0;
while (x) {
int y = x % 10;
ans += y * poww(b, count);
count++;
x /= 10;
}
return ans;
}
long long poww(int x, int y) {
long long ans = 1;
while (y != 0) {
ans *= x;
y--;
}
return ans;
}
我认为这可能是练习编写一些 Java 代码的好机会,并提出了以下解决方案。在我的系统上,它在 1 毫秒内给出了两个数字 419 和 792 的解决方案(正如您在之前对问题的编辑中所写,结果应该是 Base X: 47 Base Y: 35)。
代码只是使用了一些智能暴力:)。
public class TwoBases {
public static void main(String[] args) {
long beg = System.nanoTime();
solve(419, 792);
System.out.println("Time needed to calculate: "+(System.nanoTime()-beg)/1000000.0 + "ms");
}
public static void solve(int a, int b) {
int[] aDigits = new int[3];
int[] bDigits = new int[3];
for (int i = 0; i < 3; i++) {
aDigits[2 - i] = (a / (int) Math.pow(10, i)) % 10;
bDigits[2 - i] = (b / (int) Math.pow(10, i)) % 10;
}
for (int x = 10; x <= 15000; x++) {
int numBaseX = digitsToBase10(aDigits, x);
int y = 10;
while (y <= 15000) {
int numBaseY = digitsToBase10(bDigits, y);
if (numBaseX == numBaseY) {
System.out.println("Base X: " + x + " Base Y: " + y);
return;
} else if (numBaseY > numBaseX) {
break;
} else {
y++;
}
}
}
System.out.println("Nothing found");
}
public static int digitsToBase10(int[] digits, int b) {
int res = 0;
for (int i = 0; i < digits.length; i++) {
res += digits[i] * (int) Math.pow(b, digits.length - 1 - i);
}
return res;
}
}