21 回文质数
作者: xxx时间限制: 1S章节: 循环
问题描述 :
因为151既是一个质数又是一个回文数(从左到右和从右到左是看一样的),所以 151 号是回文质数。写一个程序来找出范围[a,b](5<= a
< b <= 100,000)间的所有回文质数 输入说明 :仅 1 行: 二个整数 a 和 b(5<= a < b <= 100,000)。 输出说明 :
输出一个回文质数的列表,一行一个。
每行首尾无空格,最后无空行。 输入范例 : 300 500 输出范例 : 313 353 373 383
代码:
/*
T21 回文质数
*/
#include<stdio.h>
#include<math.h>
#define MAX_SIZE 8
int judgePrime(int x);
int judgePalin(int x);
int main() {
int a = 0, b = 0;
int i = 0;
scanf("%d%d", &a, &b);
for (i = a; i <= b; i++) {
if (judgePrime(i) && judgePalin(i)) {
printf("%d\n", i);
}
}
return 0;
}
// 判断素数
int judgePrime(int x) {
int i = 0;
for (i = 2; i <= sqrt(x); i++) {
if (x % i == 0)
return 0;
}
return 1;
}
// 判断回文数(方法1)
int judgePalin(int x) {
int digit = 0;// 数字位数
int temp = x;// 暂存x
int stack[MAX_SIZE];
int top = 0;// 定义并初始化栈
while (x) {// 统计数字位数
x /= 10;
digit++;
}
x = temp;
while (1) {// 逐位分离数字
stack[++top] = x % 10;
x /= 10;
if (top == digit / 2) {// 分离到一半,结束
if (digit % 2 != 0) {// 数字位数为奇数,则跳过一位
x /= 10;
}
break;
}
}
while (x) {
if (stack[top--] != x % 10) {// 前后对应数字位不等,则不为回文数
return 0;
}
x /= 10;
}
return 1;
}
方法2:
// 判断回文数(方法2)
int judgePalin(int x) {
int digits[MAX_SIZE];
int count = 0;
int i = 0;
while (x) {// 逐位分离数字
digits[++count] = x % 10;
x /= 10;
}
for (i = 1; i <= count / 2; i++) {
if (digits[i] != digits[count - i + 1])
return 0;
}
return 1;
}
开始是我想多了,以为一定要用栈来做。后面发现可以不用,还少了一个循环,代码也简练了很多