原题链接:蓝桥杯算法提高VIP-特殊的质数肋骨
解题思路:
简单枚举。。7,,8超时 直接离线打表
注意事项:
参考代码:
#include <bits/stdc++.h>
using namespace std;
map<int ,int>add;//做了点优化 然并卵
bool check(int n){ //此函数 作用判断n+1位到n+length位有没有偶数
char s[100];
sprintf(s,"%d",n);
for(int i=1;s[i];i++)
if((s[i]-'0')%2==0)
return 1;
return 0;
}
bool prime(int n){ //素数检测
if(n==1||n==0) return 0;
for(int i=2;i*i<=n;i++)
if(n%i==0)
return 0;
return 1;
}
int main(){
int n;
cin>>n; //对7和8打表
if(n==7){
printf("2339933\n2399333\n2939999\n3733799\n5939333\n7393913\n7393931\n7393933");
return 0;
}
if(n==8){
printf("23399339\n29399999\n37337999\n59393339\n73939133");
return 0;
}
int time=n;
int end=1;
int begin=1;
while(time--){ //判断开始枚举的位置 和结束位置
end*=10;
}
begin=end/10;
if(begin==1)
begin++;
for(int i=begin;i<=end;i++){ //开始枚举
if(check(i)){
continue; //如果第该数字中第n+1位到n+length存在偶数例如(23383),
//直接下一个
}
int ans=0;
int temp=i;
while(temp){
if(add[temp]!=0){
ans+=add[temp];//如果之前计算过 就直接加起来 (记忆化搜索)
break;
}
if(prime(temp)) //一位一位的拆开
ans++;
else
break;
temp/=10;
}
if(ans==n){ //判断ans是否和n相等
cout<<i<<endl;
add[i]=ans; //记录数据
}
}
return 0;
}0.0分
0 人评分
C语言网提供由在职研发工程师或ACM蓝桥杯竞赛优秀选手录制的视频教程,并配有习题和答疑,点击了解:
一点编程也不会写的:零基础C语言学练课程
解决困扰你多年的C语言疑难杂症特性的C语言进阶课程
从零到写出一个爬虫的Python编程课程
只会语法写不出代码?手把手带你写100个编程真题的编程百练课程
信息学奥赛或C++选手的 必学C++课程
蓝桥杯ACM、信息学奥赛的必学课程:算法竞赛课入门课程
手把手讲解近五年真题的蓝桥杯辅导课程
发表评论 取消回复