是否存在数字分解算法?

时间:2016-05-15 10:30:27

标签: java algorithm

最近我遇到了2个容易出问题的问题,可以在一小时内解决。我对竞争性编程并不熟悉,所以这对我来说并不容易,而且我只是采用蛮力方法,所以现在我感兴趣的是我的解决方案是否有效,如果有的话是更好的解决方案。

问题是:

给定N(2位或更多),找到最小数字,使其数字的乘积等于N.如果不可能,则返回0.

我在java中的解决方案看起来像这样

int getNumber(int N) {
    int i = 25;
    while(i < Integer.MAX_VALUE) {
        if(digitsMult(i) == N)
            return i;
        i++;
    }
    return 0;
}

如果你能检查第二个问题也会很好。

给定N,返回X,这样

X&gt; N,X - 简单,X - 回文

这里我也使用蛮力

int getPrimePalindrome(int N) {
    int i = N;
    while(i < Integer.MAX_VALUE) {
        if(isPalindrome(i))
            if(isPrime(i))
                return i;
        i++;
    }
    return 0;
}

boolean isPalindrome(int n) {
    String num = Integer.toString(n);
    String reverse = new StringBuffer(n).reverse().toString();
    return num.equals(reverse);
}

boolean isPrime(int n) {
    if(n == 2)
        return true;
    if(n % 2 == 0)
        return false;

    for(int i = 3; i*i <= n; i+=2)
        if(n % i == 0)
             return false;

    return true;
}

1 个答案:

答案 0 :(得分:2)

这种问题在编码访谈中很常见。你提出的“暴力强迫”是唯一的方法,但是,我认为他们正在寻找的是聪明的优化,

例如,你的isPalindrome可以更有效率 - 你只需要检查前半部分的匹配,而不是整个事情。

其次,你不想每次都在内循环内计算你的素数叠加。我会将isPrime移动到外部if,这将允许您维护完整的素数列表,而不必每次都计算它。