原题链接:蓝桥杯算法提高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、信息学奥赛的必学课程:算法竞赛课入门课程
手把手讲解近五年真题的蓝桥杯辅导课程
发表评论 取消回复