解题思路:
简单枚举。。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 人评分