项目Euler 37 Java

时间:2015-12-22 16:48:02

标签: java

我一直试图弄清楚为什么我的程序无法解决这个问题。它是关于可截断的素数。

原始问题

3797号有一个有趣的属性。作为素数本身,可以从左到右连续删除数字,并在每个阶段保持素数:3797,797,97和7.同样,我们可以从右到左工作:3797,379,37和3。

找到从左到右和从右到左都可截断的仅有11个素数之和。

注意:2,3,5和7不被视为可截断的素数。

我认为我的程序的Truncatable部分是正确的:

public static boolean isTruncatable(String x) {
        int num = 0;
        for (int i = 0; i < x.length(); i++) {
            num = Integer.parseInt(x.substring(0, x.length() - i));
            if (!isPrime(num)) {
                return false;
            }
            System.out.println("From right: " + num);
            num = Integer.parseInt(x.substring(i, x.length()));
            if (!isPrime(num)) {
                return false;
            }
            System.out.println("From left: " + num);
        }
        return true;
    }

使用&#34; 3797&#34;作为输入打印

From right: 3797
From left: 3797
From right: 379
From left: 797
From right: 37
From left: 97
From right: 3
From left: 7

其他计划

public class Problem37TruncatablePrimes {

    public static void main(String[] args) {
        long start = System.currentTimeMillis();
        int counter = 0, sum = 0, i = 10;
        while (counter < 10) {
            if (isPrime(i)) {
                if (isTruncatable(Integer.toString(i))) {
                    sum += i;
                    counter++;
                    System.out.println(i);
                }
            }
            i++;
        }
        System.out.println(sum);
        long stop = System.currentTimeMillis();
        System.out.println((stop - start) + "ms");
    }

    public static boolean isTruncatable(String x) {
        int num = 0;
        for (int i = 0; i < x.length(); i++) {
            num = Integer.parseInt(x.substring(0, x.length() - i));
            if (!isPrime(num)) {
                return false;
            }
            num = Integer.parseInt(x.substring(i, x.length()));
            if (!isPrime(num)) {
                return false;
            }
        }
        return true;
    }

    public static boolean isPrime(int x) {
        if (x == 2) {
            return true;
        }
        if (x % 2 == 0) {
            return false;
        }
        for (int i = 2; i <= Math.sqrt(x); i++) {
            if (x % i == 0) {
                return false;
            }
        }
        return true;
    }

}

它没有达到3797并打印

11
13
17
23
31
37
53
71
73
113
442

感谢您的帮助。

编辑:问题是1不是素数,所以感谢wolfsgang指出了这一点。另外,我希望它转到3797,因为问题说只有11个Truncatable primes而3797就是其中之一。

1 个答案:

答案 0 :(得分:2)

11,13,31,71,113之类的数字不是左右截断的,因为1不是素数。
你必须改变你的isPrime()函数来包含这种情况。然后只有你将有正好11个素数,直到3797.
否则,当你运行这个代码时,你会得到前1000个数字中的11个数字作为易处理的。 也改变

(while (counter < 10) {)

(while (counter < 11) {)