一、题目链接
http://noi.openjudge.cn/ch0113/05/
二、解题思路
三、实施步骤
四、Java程序
import java.util.Scanner;
public class Main {
/**
* 判断给定整数是否为素数
*
* @param n int类型的整数,代表给定整数
* @return true当且仅当n是素数,否则false
*/
public boolean isPrime(int n) {
if (n == 2) { // 如果n等于2
return true; // n是素数
}
else if (n < 2 || n % 2 == 0) { // 否则如果n是小于2的数或者非2的偶数
return false; // n不是素数
}
else { // 否则,n是大于2的奇数
/* 遍历[3,sqrt(n)]范围内的每个奇数 */
for (int i = 3; i * i <= n; i = i + 2) {
if (n % i == 0) { // 如果[3,sqrt(n)]范围内存在n的真因子
return false; // n不是素数
}
}
return true; // 以上没有返回false,说明n是素数
}
}
/**
* 判断给定整数是否为回文数
*
* @param n int类型的整数,代表给定整数
* @return true当且仅当n是回文数,否则false
*/
public boolean isPalindrome(int n) {
if (0 <= n && n < 10) { // 如果n是一位数字
return true; // n是回文数
}
int reverse = 0; // n的反转数,初始时为0
int t = n; // 保留n的原始值
/* 在n尚未反转完毕时 */
while (n != 0) {
reverse = reverse * 10 + n % 10; // 将当前n的个位数追加到reverse上
n = n / 10; // 移除当前n的个位数
}
return reverse == t; // n是否为回文数,取决于它是否等于它的相反数
}
/**
* 计算给定区间内既是素数又是回文数的整数个数
*
* @param from int类型的整数,代表给定区间的左边界
* @param to int类型的整数,代表给定区间的右边界
* @return int类型的整数,代表[from,to]区间内既是素数又是回文数的整数个数
*/
public int count(int from, int to) {
int ans = 0; // [from,to]区间内既是素数又是回文数的整数个数,初始时为0
/* 遍历[from,to]区间内的每个整数 */
for (int i = from; i <= to; i++) {
if (isPrime(i) && isPalindrome(i)) { // 如果当前整数i既是素数又是回文数
ans++; // 计算结果加1
}
}
return ans;
}
public static void main(String[] args) {
Main test = new Main();
Scanner input = new Scanner(System.in);
int n = input.nextInt();
System.out.print(test.count(11, n));
}
}