時間膨脹是真實存在的,你的頭比腳老得更快
阿新 • • 發佈:2022-04-11
判斷是否為素數(一般方法):
時間複雜度O(sqrt(n))
//1 bool Find_prime(int n) { if(n<=1) return false;//特判 else{ for(long long i=2;i*i<=n;i++){//開longlong防止i*i溢位 if(n%i==0) return false; } return true; } } //2 bool Find_prime(int n) { int m=sqrt(1.0*n); if(n<=1View Code) return false;//特判 for(int i=2;i<=m;i++){ if(n%i==0) return false; } return true; }
素數表的獲取:
1.一般方法:範圍在10^5內可以使用
時間複雜度:O(n loglogn)
const int MAX=100; int prime[MAX],pNum=0;//pNum素數個數 bool p[MAX]={0};//素數為true bool is_Prime(int n) { if(n<=1) return false;//特判 elseView Code{ for(long long i=2;i*i<=n;i++){//開longlong防止i*i溢位 if(n%i==0) return false; } return true; } } void find_prime(){ for(int i=1;i<=MAX;i++){ if(is_prime(i)==true){ prime[pNum++]=i; p[i]=true; } } }
2.篩法:
時間複雜度:O(n loglogn)
如果i為素數則i的倍數不為素數,前提是首先知道2為素數,因此第一次迴圈從2開始。表長至少要比n大1
const int MAX=101;//100內的素數 int prime[MAX],pNum=0;//pNum素數個數 bool p[MAX]={0};//素數為false void Find_prime(){ for(int i=2;i<MAX;i++){//不能寫i<MAX if(p[i]==false){ prime[pNum++]=i; for(int j=i+i;i<MAX;j+=i){ p[j]=true; } } } }View Code