求调
查看原帖
求调
850498
__erinww楼主2023/7/6 10:59
in:
2147483 3532156
out:
3196067,3196068 are closest, 3117299,3117421 are most distant.

3196067 和 3196068 都不是质数,

in:
3196067 3196069
out:
There are no adjacent primes.

经调试,上面数据的质数数组为空。

好怪,

代码:

#include <iostream>
#include <math.h>
#include <string.h>

#define int long long

using namespace std;

const int MAXN = 1048576;
bool NOT_PRIME[MAXN];
int  PRIME[MAXN],len ;
int l,r;
int prime[] = {-1,2,3,5,7,11,13,17,19,23,29,31,37,41,43,47,53,59,61,67,71,73,79,83,89,97,101,103,107,109,113,127,131,137,139,149,151,157,163,167,173,179,181,191,193...省略区间[194,sqrt(2147483647)]的所有质数
};
void ERATOSTHENES(int l,int r){
	for(int i = 1;prime[i]*prime[i] <= r;i ++){
		int &p =  prime[i];
		int t  =  1;
		for(int j = l;j <= r;j += t){
			if(j%p == 0 && j != p) 
				t = p,NOT_PRIME[j-l] = true;
		}
	}
	for(int i = l;i <= r;i ++)
		if(!NOT_PRIME[i-l]) PRIME[++ len] = i;//cout << PRIME[len] << ' ';
	if(len <= 1) return puts("There are no adjacent primes."),void();
	int MIN = 9e+17,MAX = 0;
	int min_a,min_b,max_a,max_b;
	for(int i = 2;i <= len;i ++){
		int aw = PRIME[i]-PRIME[i-1];
		if(MIN > aw)	MIN = aw,min_a = PRIME[i-1],min_b = PRIME[i];
		if(MAX < aw)	MAX = aw,max_a = PRIME[i-1],max_b = PRIME[i];
	}
	printf("%lld,%lld are closest, %lld,%lld are most distant.\n",min_a,min_b,max_a,max_b);
}

signed main(){
	while(scanf("%lld %lld",&l,&r) != EOF) memset(NOT_PRIME,false,sizeof NOT_PRIME),len = 0,ERATOSTHENES(l,r);
	return 0;
}
2023/7/6 10:59
加载中...