//题目:求 1000 以内的所有回文素数。
//前提背景: 素数(质数): 从2 ~ n 只能除以 1 跟 自身 的数
//法一 通过调用函数 实现 题目要求
#include<stdio.h>
int sushu(int i) //sushu()函数作用:判断是不是素数
{
int j;
if(i<=1)
{
return 0;
}
if(i == 2)
{
return 1;
}
for(j=2;j<i;j++)
{
if(i%j == 0)
{
return 0; //如果 i%0 == 0 则不是素数 例如6%3 == 0 可以推出 6不仅可以➗ 本身 跟 1 还能 ➗ 3跟2
}
else if(i != j+1)
{
continue;
}
else
{
return 1; //其实就是 if(i%j !=0);
}
}
}
// 锻炼编程思维,肯定是 看题目 先写mian() 再写其他函数,通过mian() 调用其他函数 实现程序
int main()
{
int i;
for(i=10;i<1000;i++)
{
if(sushu(i) == 1)
{
if(i/100 == 0) //若为 两位数,则进行 十位 == 个位?1:0 判断
{
if(i/10 == i%10) // i/10 = 十位数, i%10 = 个位数
{
printf("%5d ",i); //输出 这个 回文素数 的值
}
}
else
{
if(i/100 == i%10) //如果不为 2位数,而是 3位数 的话,进行 百位 == 个位?1:0 判断
{
printf("%d ",i); //输出 回文素数
}
}
}
}
return 0;
}
思路分析:
//第一步:
要知道 “素数” 是什么? 也就是要知道这个背景 所谓的 “背景”题
//第二步:
最基本的 函数调用要会使用
// 定义一个函数 xxx() 其作用: 判断 是否为 “素数”
//第三步:
在main()函数中调用 xxx()函数
//也就是将 判断为 素数 的数 进行判断 其是否属于2位数
//如果 是两位数 就按 两位数的方法进行判断 是否为 回文素数 => 个位数 == 十位数?1:0
//若是 “回文素数” 则 输出 该值
//若不是 “回文素数” 则 循环控制变量 i 自增 1。
//若不是 “两位数” 则进行 三位数 的回文素数判断 也就是 判断 百位数 ==个位数?1:0
//若是 “回文素数” 则 输出 该值
//若不是 “回文素数” 则 循环控制变量 i 自增 1。
//判断两位 or 三位这个 顺序可以调换
//法二 (直接使用 mian() 函数 实现题目要求)
#include<stdio.h>
int main()
{
int flag,n,i;
for(n=10;n<1000;n++)
{
for(i=2;i<n;i++) //这层for循环的作用:"判断 素数"
{
flag = 1 ; //将flag赋值为1
if(n%i == 0) //进行 素数判断
{
flag =0;
break;
}
}
//既然 “素数”已经判断出来, 自然就要进行 “回文素数” 判断
if(flag == 1) //这边 其实 也就是 if(n%i != 0) 换汤不换药
{
if(n%100 == 0) //说明 这个值 为 “2位数”
{
if(n/10 == n%10) //这个条件: 相当于 十位数==个位数?1:0
{
printf("%4d",n);
}
}
else //这个其实也就是 换成 该数值为“3位数” 进行判断 百位数==个位数?1:0
{
if(i/100 == n%10) //这个条件: 相当于 百位数==个位数?1:0
{
printf("%4d",n);
}
}
}
}
return 0;
}
//思路比法一还简单,而且是真题,所以这边就不写思路了!
//法三
#include<stdio.h>
#include<math.h>
int main()
{
int i,j,n;
for(i=10;i<=1000;i++)
{
n=1; //将n初始值 赋值 为 1
for(j = 2;j<=(int)sqrt(i);j++)
{
if(i%j == 0)
{
n=0;
break;
}
}
if(n == 1)
{
if(i/100 ==0)
{
if(i/10 == i%10)
{
printf("%5d",i);
}
}
else
{
if(i/100 == i%10)
{
printf("%5d",i);
}
}
}
}
return 0;
}