老师我晕课10


私信TA

用户名:1710819010

访问量:11203

签 名:

最后一次

等  级
排  名 490
经  验 4642
参赛次数 7
文章发表 16
年  龄 0
在职情况 学生
学  校 贺州学院
专  业

  自我简介:

非常非常菜的菜鸡

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

  评论区

  • «
  • »