求自然数n内所有猫扑素数
猫扑数:指以2开头,后面跟任意个3的十进制数。如:2、23、233等。
素数(质数):在大于1的自然数中,除了1和它本身以外不再有其他因数,这样的数称为素(质)数。
合数:自然数中除能被1和本数整除外,还能被其他的数整除的数。如果一个数是合数,那么它的最小质因数肯定小于等于他的平方根。例如:50,最小质因数是2,2<50的开根号,
再比如:15,最小质因数是3,3<15的开根号。。1和0既非素数也非合数。
代码实现
public static void main(String[] args) {
MopPrime obj = new MopPrime();
for (int i = 0; i < Integer.MAX_VALUE; i++) {
if (obj.isMopPrime(i)) {
System.out.println(" 猫扑素数 :" + i);
}
}
}
private boolean isMopPrime(int n) {
return isMop(n) && isPrime(n);
}
private boolean isMop(int n) {
if (n < 10) {
return n == 2;
} else {
// 从后往前按位依次检查
return (n % 10 == 3) && isMop(n / 10);
}
}
private boolean isPrime(int n) {
boolean flag = true;
if (n < 2) {
flag = false; //素数不小于2
} else {
// 如果一个数是合数,那么它的最小质因数肯定小于等于他的平方根。
for (int i = 2; i <= Math.sqrt(n); i++) {
if (n % i == 0) {
flag = false;
break;
}
}
}
return flag;
}
判断素数的方法还可优化。思路:找规律避免无用判断。