链接: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 }
时间: 2024-10-11 12:02:29