計蒜客練習題:素數距離
阿新 • • 發佈:2018-11-21
%d 篩選 prime 最小 png 表數 cin 分享圖片 ret
計蒜客練習題:素數距離
解題思路:遍歷一遍is_prim數組 存儲[l,r]區間上是質數的數和質數總數(存儲素數表);遍歷一遍素數表數組 更新最大值 最小值機器對應的變量,最後打印即可。
AC代碼:
#include<iostream> #include<cstdio> using namespace std; int n; int is_prime[8000010]; int primeArr[8000010]; //素數篩選法 int prime(int l,int r){ for (int i = 2; i <= r; ++i) { is_prime[i] = 1; } for (int i = 2; i * i <= r; ++i) { if (is_prime[i]) { for (int j = i * i; j <= r; j +=i) { is_prime[j] = 0; } } } } int main(){ int l,r; cin>>l>>r; prime(l,r); //遍歷一遍is_prim數組 存儲[l,r]區間上是質數的數和質數總數 //遍歷一遍數組 更新最大值 最小值機器對應的變量,最後打印即可 int k = 0; for(int i=l;i<=r;i++){ if(is_prime[i]){ primeArr[k++] = i; } } // //現在k表示區間上的素數總數 if(k<2){ cout<<"There are no adjacent primes."<<endl; return 0; } int mind = 0x3f3f3f3f; int maxd = -0x3f3f3f3f; int d1,d2; for(int i=0;i<k-1;i++){ int t = primeArr[i+1] - primeArr[i]; if(t < mind){ mind = t; d1 = i; } if(t > maxd){ maxd = t; d2 = i; } } printf("%d,%d are closest, %d,%d are most distant.\n",primeArr[d1],primeArr[d1+1],primeArr[d2],primeArr[d2+1]); return 0; }
計蒜客練習題:素數距離