zoukankan      html  css  js  c++  java
  • 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 }
  • 相关阅读:
    JavaScript数组方法--includes、indexOf、lastIndexOf
    JavaScript数组方法--flat、forEach、map
    JavaScript数组方法--filter、find、findIndex
    bootstrap-14
    bootstrap-13
    bootstrap-12
    bootstrap-11
    bootstrap-10
    bootstrap-9
    bootstrap-8
  • 原文地址:https://www.cnblogs.com/pter/p/5684775.html
Copyright © 2011-2022 走看看