回文素数
1.问题描述
回文素数指的是一个整数n从左到右和从右到左读其数值都相同且n为素数,则称整数n为回文素数。
求出所有不超过1000的回文素数。
2.问题分析
判断素数就不说了,一会做个函数判断就行
求回文数,我用的是穷举法,判断一千以内所有整数,如果是回文数,再去判断是不是素数,如果都符合,就打印输出。
3.算法设计
因为是一千以内的数,我们先把这个数拆分,三重循环,遍历一千以内的整数,就是这样
for (i = 0; i <= 9; i++) for (j = 0; j <= 9; j++) for (k = 0; k <= 9; k++) { n = i * 100 + j * 10 + k; m = k * 100 + j * 10 + i;
}
还要进行一个判断,因为这个数可能有一个位置为0,下面这个就是前两位为0
if (i == 0 && j == 0) { m = m / 100; }
这个是第一位为0
else if (i == 0) { m = m / 100; }
4.程序
#include<iostream> using namespace std; int fun(int n)//这个就是判断n是不是为素数 { int i; for (i = 2; i < (n - 1) / 2; ++i) { if (n % i == 0) return 0; } return 1;//如果符合条件,就返回1 } int main() { int i, j, k, n, m;//这里的m是n的顺序相反的数 for (i = 0; i <= 9; ++i)//穷举第一位 for (j = 0; j <= 9; ++j)//穷举第二位 for (k = 0; k <= 9; ++k)//三重循环,穷举第三位 { n = i * 100 + j * 10 + k;//计算出三位数 m = k * 100 + j * 10 + i;//这是顺序相反的数 if (i == 0 && j == 0)//判断前两位为0的情况 { m = m / 100; } else if (i == 0)//判断第一位为0的情况 { m = m / 100; } if (n > 10 && n == m && fun(n))//判断n如果大于10,n和顺序相反的m相同,而且n也是个素数 { cout << n << endl; } } return 0; }