可截短素数
数字 3797 有一个有趣的性质:它自己是一个素数,同时我们可以从左至右逐步截断这个数
字,得到 3797,797,97 和 7,它们也都是素数。同样,我们也可以从右至左逐步截断这个
数字,得到 3797,379,37 和 3 也都是素数。求仅有的十一个从左至右和从右至左都可以截
短的素数之和(注:2,3,5 和 7 不被认为是可截短素数)。
答案:748317
思路:1、判断是否是素数 2、截断
运用substring
substring(int beginIndex):从索引beginIndex开始,截到字符串末尾
substring(int beginIndex, int endIndex):从beginIndex开始,截到endIndex-1结束
代码如下:
public static boolean prime(int n){
if(n==1) return false;
for(int i=2;i*i<=n;i++)
if(n%i==0) return false;
return true;
}
public static boolean num(int n){
if(!prime(n)) return false;
String s=String.valueOf(n);
String s1,s2;
for(int i=1;i<s.length();i++) {
s1 = s.substring(i);
s2 = s.substring(0,s.length()-i);
if(!(prime(Integer.valueOf(s1))&&prime(Integer.valueOf(s2)))) return false;
}
return true;
}
public static void main(String[] args) {
int m=0,t=0;
for(int i=11;;i++) {
if (num(i)) {
t += i;
m++;
}
if(m==11) break;
}
System.out.println(t);
}
程序运行结果:
另一种做法:
private static boolean isTruncatablePrime(int n) {
// 从左往右截
for (long i = 10; i <= n; i *= 10) {
if (!isPrime(n % (int)i))
return false;
}
// 从右往左截
for (; n != 0; n /= 10) {
if (!isPrime(n))
return false;
}
return true;
}