線性篩素數&尤拉函式
阿新 • • 發佈:2019-01-08
線性篩素數:
(關鍵程式碼為當i%prime[j]==0的時候跳出。)
#include <iostream> //線性篩素數。 #include <cstring> using namespace std; const int inf=1e6+7; int flag[inf]; //表示的是inf是不是質數,0表示不是,1表示是。 int prime[inf]; int k=0; void findprime(int n) { for(int i=2;i<=n;i++) { if(!flag[i]) //說明i是素數。看來還是要使用素數的,因為尤拉篩是依照素數來進行篩後邊的資料的。 { prime[k++]=i; //新增上素數. } for(int j=0;j<k&&prime[j]*i<=n;j++) { flag[ prime[j]*i ]=1; //標記和數。 if(i%prime[j]==0) break; } } } int main() { int n; scanf("%d",&n); memset(flag,0,sizeof(flag)); findprime(n); for(int i=0;i<k;i++) printf("%d\n",prime[i]); return 0; }
尤拉函式:
#include <iostream> //尤拉函式。 #include <cstring> using namespace std; const int inf=1e6+7; int phi[inf]; //phi[i]的含義是i 的尤拉函式值是多少?也就是說有幾個數字和i是互質的。 int flag[inf]; int prime[inf]; //記錄素數,標記素數。 int k=0; void euler(int n) { phi[1]=1; //特例。 for(int i=2;i<=n;i++) { if(!flag[i]) //說明i是質數。 { phi[i]=i-1; prime[k++]=i; } for(int j=0;j<k&&prime[j]*i<=n;j++) { if(prime[j]*i>n) break; flag[prime[j]*i]=1; //標記和數。 if(i%prime[j]==0) //求質因數。 { phi[i*prime[j]]=phi[i]*prime[j]; break; } else phi[i*prime[j]]=phi[i]*phi[prime[j]]; } } } int main() { int n; scanf("%d",&n); memset(flag,0,sizeof(flag)); euler(n); for(int i=1;i<=n;i++) printf("%d %d\n",i,phi[i]); return 0; }