萌新#4,#5 TLE求助
查看原帖
萌新#4,#5 TLE求助
297925
OvCherryBlossomRain楼主2021/5/16 10:47
#include<bits/stdc++.h>
using namespace std;
const int maxn = 1e8+10;
int prime[maxn];
bool isprime[maxn];
long long ans = 0;
int fk[4] = {2,3,5,7};
void Prime(){
	memset(isprime,1,sizeof(isprime));
	isprime[0] = isprime[1] = 0;
	for(int i=2;i<=maxn;i++){
		if(isprime[i]){
			prime[++ans] = i;
		}
		for(int j=1;j<=ans&&i*prime[j]<=maxn;j++){
			long long temp = (long long)i*prime[j];
			isprime[temp] = 0;
			if(i%prime[j]==0) break;
		}
	}
}
int main(){
	int n;
	scanf("%d",&n);
	Prime();
	for(int k=0;k<4;k++){
		for(int i=fk[k]*pow(10,n-1);i<=(fk[k]+1)*pow(10,n-1);i++){
		    int temp = i;
		    while(isprime[temp]){
			    temp/=10;
		    }
		    if(temp==0) printf("%d\n",i);
	    }
	}
	return 0;
} 

具体思路:首先是欧拉筛预处理,fk数组的意义:第一位数字只能是2,3,5,7,所以可以跳着判断。while循环是判断:例如temp=7331时,temp/10(也就是733)继续判断是否符合条件,直到temp为0时输出正确结果。

#4,#5 TLE 的数据点应该是n=7和n=8的时候,这个代码不知道还能不能再优化一下过#4,#5呢?(实在想不到还能怎么优化了)

2021/5/16 10:47
加载中...