用二维动态数组递推(较简单)
2025-07-11 18:23:03
发布于:浙江
5阅读
0回复
0点赞
(PS:这个方法比较快,关于为啥n是1到8,因为到9就没了)
整体思路:从长度为2时依次递推(长度为1时明显是2,3,5,7),将上一次长度的每一项放在前面,并尝试在后面加一个一位奇数(除5以外)时是否为质数(因为末尾为偶数或0,5不可能为质数)。
所以这道题要掌握以下知识点:
1.判断质数
2.二维动态数组
3.递推
#include <bits/stdc++.h>
using namespace std;
bool prime(int n){
if(n<2) return 0;
for(int i=2;i<=sqrt(n);i++){
if(n%i==0){
return 0;
}
}
return 1;
}//判断质数函数
vector <vector <int>> v(15);//PS:别忘记把项数最大值加5~10
int main(){
int n;
cin>>n;
v[1].push_back(2);
v[1].push_back(3);
v[1].push_back(5);
v[1].push_back(7);//定义长度为1时的数组,ps:别怕下面的三个for(doge)
for(int i=2;i<=n;i++){ //递推
for(int j=0;j<v[i-1].size();j++){//遍历上一次的每一项
for(int k=1;k<10;k+=2){//尝试加1,3,7,9
int temp=v[i-1][j]*10+k;
if(k!=5&&prime(temp)){
v[i].push_back(temp);
}//如果加后是质数,则加入当前数组,顺便去掉加5(即上面的奇数除5以外)
}
}
}
for(int i=0;i<v[n].size();i++){
cout<<v[n][i]<<endl;
}//输出
}
这里空空如也
有帮助,赞一个