タイトル説明
数論と呼ばれる数学の枝は、数字の性質についてです。何千年もの数の理論家の関心を獲得している分野の一つは、素数の問題です。素数には、適切な因子(それだけで割り切れる1自体によるものである)を有していない数です。最初の素数は2,3,5,7-ですが、彼らはすぐにあまり頻繁になります。興味深い問題の一つは、彼らが様々な範囲にあるか密です。隣接する素数は、両方の素数ある二つの数字ですが、隣接する素数の間には、他の素数はありません。例えば、2,3は、隣接する数字だけ隣接素数です。
すなわち(LとU(1 <= L <U <= 2147483647)、あなたが最も近い2つの隣接する素数C1とC2(L <= C1 <C2 <= U)を見つけるためにある:あなたのプログラムは、2つの数字を与えていますC2-C1)が最小となります。離れて同じ距離にある他の対が存在する場合、最初のペアを使用します。もしD1およびD2は、可能な限り互いにとして離れているD1及びD2(L <= D1 <D2 <= U)は(タイが存在する場合、再び最初のペアを選択すること)は、2つの隣接する素数を見つけることもあります。エントリー
入力の各ラインは、LとUの間の差が1,000,000を超えないU. <Lで、2つの正の整数であり、LおよびUを含有するであろう。輸出
各LとUのために、出力は、いずれかまたは隣接素数の二組を与える行(2つ未満の二つの与えられた数の間の素数があるので)が隣接素数が存在しないことを声明であろう。サンプル入力
2 17 14 17サンプル出力
2,3 7,11が最も離れている、最も近いです。 隣接する素数はありません。
#include <ビット/ STDC ++ H> 名前空間STDを使用して、 typedefの長い長いLL。 const int型MAXN = 500010; int型VIS [1000100]、プライム[MAXN]、TOT、[MAXN]、NUM、MINP、をmaxP。 空get_prime(){ のために(int型I = 2; I <= 50000;私は++){ 場合(VIS [i]が!){ プライム[++ TOT] = I; } のための(int型J = 0; J <TOT && 1LL iが素数[j]を* <= 50000; J ++){ VIS [i *が素数[J] = 1。 IF(I%プライム[j] == 0){ 破ります。 } } } } int型のmain(){ int型のL、R。 get_prime(); 一方、(〜のscanf( "%d個の%のD"、&L&R)){ memsetの(VIS、0、はsizeof(VIS))。 以下のために(INT i = 0; iはTOT <; iは++){ int型P =プライム[I]。 { - (; J <= R J + = P 1)/ P * Pの)のLL J = MAX(P *は2LL、(1LL *のL + P)用 VIS [J - L] = 1。 } } NUM = 0。 以下のために(INT i = 0; I <= R - L; iは++){ IF(!VIS [I] && iはL +> 1){ [NUM ++] = iが+ L。 } } もし(NUM <2){ のprintf( "なし隣接素数はありません\ n"); 持続する; } MINP = 0。 maxP = 0; 以下のために(INT i = 0; I + 1 <NUM; iは++){ INT D = [I + 1] -a [I]。 IF(D <MINP + 1] - [MINP])MINP = I。 IF(D>をmaxP + 1] - [をmaxP])をmaxP = I。 } のprintf( "%のD、%dは、%のD、%dは最も遠い最も近接している\ n"、[MINP]、[MINP + 1]、[をmaxP]、[をmaxP + 1])。 } }
首相の距離
おすすめ
転載: www.cnblogs.com/Accpted/p/11334350.html
おすすめ
ランキング