Найти две базы, которые при конвертации в базу 10 равны

У меня сегодня очень сложная проблема. Я не могу придумать способ решить это.

В качестве входных данных введите 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 включительно.

Что я пробовал:

Я перепробовал все значения X от 10-15000 и все значения Y от 10-15000 и проверил, удовлетворяют ли они уравнению. Однако этот метод крайне медленный. У кого-нибудь есть более быстрое решение? Благодарю.

Мой плохой код:

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;
}

-3

Решение

Я подумал, что это может быть хорошим поводом для написания кода на Java, и придумал следующее решение. В моей системе это решение двух чисел 419 и 792 (как вы писали в более ранней редакции вашего вопроса, результатом должно быть Base X: 47 Base 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;
}
}
0

Другие решения


По вопросам рекламы ammmcru@yandex.ru
Adblock
detector