13.[程序题]
回文素数
题目描述
回文素数是一个顺序读与逆序读都相同的素数,如5,11,131是回文素数,121是回文数但不是素数,所以121不是回文素数,31是素数但不是回文 ,所以31不是回文素数。
现在给出两个整数a,b(1<=a<=b<=1000000),要你求出在闭区间a,b内有多少回文素数。
输入
有多组测试数据,每组测试数据输入两个正整数a,b(1<=a<=b<=1000000)
当a,b都为0时表示输入结束,你不需要处理这组数据。
输出
每组测试数据输出[a,b]区间内的回文素数的总数,每组输出占一行。
样例输入
1 10
10 11
0 0
样例输出
4
1
提示: 先判断回文, 再判断素数
基于new bing的编写,参考学习:
#include <stdio.h>
#include <stdbool.h>
bool isPrime(int num) {
if (num == 2 || num == 3) {
return true;
}
if (num == 1 || num % 2 == 0) {
return false;
}
for (int i = 3; i * i <= num; i += 2) {
if (num % i == 0) {
return false;
}
}
return true;
}
bool isPalindrome(int num) {
int temp = num, reverseNum = 0;
while (temp > 0) {
reverseNum = reverseNum * 10 + temp % 10;
temp /= 10;
}
return reverseNum == num;
}
int main() {
int a, b, result[100], count = 0;
while (true) {
scanf("%d%d", &a, &b);
if (a == 0 && b == 0) {
break;
}
int palindromePrimeCount = 0;
for (int i = a; i <= b; i++) {
if (isPrime(i) && isPalindrome(i)) {
palindromePrimeCount++;
}
}
// 保存结果
result[count++] = palindromePrimeCount;
}
// 输出结果
for (int i = 0; i < count; i++) {
printf("%d\n", result[i]);
}
return 0;
}
供参考:
#include<stdio.h>
int isPrime(int n) //判断素数
{
int i;
if (n < 4) return n > 1;
for (i = 2; i * i <= n; i++)
if (n % i == 0) return(0);
return(1);
}
int ispalindrome(int n)//判断回文数
{
int t = n, k = 0;
while (t) {
k = k * 10 + t % 10;
t /= 10;
}
return k == n;
}
int main()
{
int i, a, b, cnt;
while (scanf("%d%d", &a, &b) == 2 && a != 0 && b != 0) {
for (i = a, cnt = 0; i <= b; i++) {
if (isPrime(i) && ispalindrome(i))
cnt++;
}
printf("%d\n", cnt);
}
return 0;
}