給出乙個區間 [l, r] 求其中相鄰的距離最近和最遠的素數對 . 其中 1 <= l < r <= 2,147,483,647, r - l <= 1e6
思路單純打表是不行的,l,r的範圍太大,不能直接求出所有素數。對於int範圍內的合數來說,最小質因子必定小於2^16。所以先用篩法選出50000內的素數即可,因為50000的平方大於int範圍了。再用這些素數去篩出r-l之間的合數,剩下的就是r-l之間的素數了。然後依次比較求出相鄰素數的最大值和最小值即可。二次篩法。。。
區間長度只有1e6,所以在存的時候雖然不能直接存每個數,但是可以加個偏移量l,這樣便可存的下。
#include
#include
#include
#define ll long long
using
namespace std;
const
int maxn =
1e6+10;
const
int max =
1e5;
int prime[max]
,vis[maxn]
, cnt;
void
get_prime
(void)}
}int
main
(void)}
if(l ==
1) vis[0]
=1;// 當l是1時,vis[0]=1表示1不是素數
ll pre =-1
, sol1 = maxn, sol2 =
0, x1, y1, x2, y2;
//pre代表上乙個素數
for(
int i =
0; i <= r - l; i++)if
(sol2 < i - pre)
} pre = i;}}
if(sol2 ==0)
puts
("there are no adjacent primes.");
else
printf
("%lld,%lld are closest, %lld,%lld are most distant.\n"
, x1 + l, y1 + l, x2 + l, y2 + l);}
return0;
}
poj 2689 區間素數篩選
由於給出的l和u太大,直接打表是不可能了。但u l 1e6,u 1e9,可以先篩出 0,sqrt u 內的素數,再以此去篩 l,u 內的素數,接著求出相鄰距離最短和最遠的一對素數就行了,這步就簡單了。如下 include include include include include include...
POJ 2689 區間篩選質數
題意 給定區間 l,u 中,求相鄰兩個質數的 最大 小 差值 所對應的質數 有多組 l,u 規模 1 l u 2,147,483,647,區間長度 1,000,000.型別 經典的區間篩選質數 分析 定理 所有的合數都可以拆分為n個質數的乘積 從l,u的大小 2的32次 明白 最大的質因子 2的16...
大區間素數篩選 POJ2689
題意 給乙個區間 l,u 1 l u 2,147,483,647 u l 1000000,求出 l,u 內距離最近和距離最遠的素數對。由於l,u都小於2 32,所以區間內的合數的最小質因子必然小於2 16,所以先篩出2 16以內的素數,用篩出來的素數去篩 l,u 內的合數。然後把 l,u 內的素數儲...