codevs 2530大质数

链接:http://codevs.cn/problem/1530/

解题思路:
这个题最关键的剪枝还是 因子小于平方根,但不是像原来那样用。
逆转思维,与其说判断哪些是质数,不如说判断哪些不是质数,更简单,更效率。
所有的合数都有一个共同的特点,就是能被拆成质因子。
那么已经出现的质因子,迟早有一次会成为一个合数的因子。
那么直接拿要判断的数挨个被质数除一遍,就可以直接判断是不是合数了。
写到这,前三个点就过了,至于最后一个100000,就是开头提到的剪枝。
不管怎样,一个合数里面的质因子一定也小于它的平方根
所以提前判断一下,试到第几个合数停止,即可效率大大提高。

 1 #include<cstdio>
 2 #include<iostream>
 3 #include<cmath>
 4 using namespace std;
 5 int n,ans,prime[100001],ph;//ph表示当前要搜的是第几个质数。 
 6 
 7 int divide(double x){//判断试到第几个素数为止 
 8     int temp=(int)x;
 9     for (int i=1;i<ph;i++){
10         if (prime[i]>temp) return i-1;
11     }
12 }
13 
14 int main(){
15     cin>>n;
16     prime[1]=2;
17     prime[2]=3;
18     ph=2;
19     bool check;
20     int temp,test;
21     while(ph<n){//递归 
22         temp=prime[ph];
23         ph++;
24         while (1){
25             temp++;
26             test=divide(sqrt(temp));
27             for (int i=1;i<=test;i++) {
28                 if (temp % prime[i]==0) {check=true;break;}
29             }//挨个除一遍 
30             if (check) {check=false;continue;}
31             prime[ph]=temp;
32             break;
33         }
34     }
35     cout<<prime[n];
36 }
原文地址:https://www.cnblogs.com/pter/p/5684775.html