找到转换为基数为10的两个基数是相等的

时间:2015-01-17 19:00:06

标签: java c++ math numbers digit

今天我有一个非常具有挑战性的问题。我想不出办法解决它。

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

1 个答案:

答案 0 :(得分:0)

我认为这可能是编写一些Java代码并提出以下解决方案的好方法。在我的系统上,它给出了两个数字419和792的解决方案(正如你在早期编辑的问题中写的结果应该是基数X:47基础Y:35)在1毫秒内。

代码只使用了一些聪明的蛮力:)。

See it running online.

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