我一直试图弄清楚为什么我的程序无法解决这个问题。它是关于可截断的素数。
原始问题
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就是其中之一。
答案 0 :(得分:2)
11,13,31,71,113之类的数字不是左右截断的,因为1不是素数。
你必须改变你的isPrime()函数来包含这种情况。然后只有你将有正好11个素数,直到3797.
否则,当你运行这个代码时,你会得到前1000个数字中的11个数字作为易处理的。
也改变
(while (counter < 10) {)
到
(while (counter < 11) {)