东华oj-进阶题第21题

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; 
}

开始是我想多了,以为一定要用栈来做。后面发现可以不用,还少了一个循环,代码也简练了很多

发布了44 篇原创文章 · 获赞 6 · 访问量 7572

猜你喜欢

转载自blog.csdn.net/qq_41409120/article/details/104160444
今日推荐