今天我有一个非常具有挑战性的问题。我想不出办法解决它。
给出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;
}
答案 0 :(得分:0)
我认为这可能是编写一些Java代码并提出以下解决方案的好方法。在我的系统上,它给出了两个数字419和792的解决方案(正如你在早期编辑的问题中写的结果应该是基数X:47基础Y:35)在1毫秒内。
代码只使用了一些聪明的蛮力:)。
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;
}
}