解题思路:从做到右将数值依次增大来判断是否是质数,当左边较小的数值不是质数是便可提前结束后续遍历优化运行时间。
注意事项:num*10+j用于存储当前判断的数,初始num设置为0,因为开始时判断的数为个位数。
参考代码:#include<iostream>
using namespace std;
void check(int num,int N)
{
for(int j=1;j<=9;j++)
if((num*10+j)>1)//直接跳过首数值是1的情况,首数值是1时,必不是质数肋骨
{
if(num*10+j==2)
{
if(N==1)运行到最后一层判断,进行输出
cout<<num*10+j<<endl;
else//没有则继续进行
check(num*10+j,N-1);
}
else {
int jtc=1;
for(int i=2;i<=(num*10+j)/2;i++)
{
if((num*10+j)%i==0)//质数判断
{
jtc=0;
break;//到判定后续已经不可能是质数肋骨后提前结束计算
}
}
if(jtc==1)
if(N==1)
cout<<num*10+j<<endl;
else
check(num*10+j,N-1);
}
}
}
int main()
{
int N;
cin>>N;
check(0,N);
}
0.0分
0 人评分
C语言网提供由在职研发工程师或ACM蓝桥杯竞赛优秀选手录制的视频教程,并配有习题和答疑,点击了解:
一点编程也不会写的:零基础C语言学练课程
解决困扰你多年的C语言疑难杂症特性的C语言进阶课程
从零到写出一个爬虫的Python编程课程
只会语法写不出代码?手把手带你写100个编程真题的编程百练课程
信息学奥赛或C++选手的 必学C++课程
蓝桥杯ACM、信息学奥赛的必学课程:算法竞赛课入门课程
手把手讲解近五年真题的蓝桥杯辅导课程
发表评论 取消回复