zoukankan      html  css  js  c++  java
  • UVA 10200 Prime Time(简单素数判定预处理)

    Euler is a well-known matematician, and, among many other things, he discovered that the formula n 2 + n + 41 produces a prime for 0 ≤ n < 40. For n = 40, the formula produces 1681, which is 41 ∗ 41. Even though this formula doesn’t always produce a prime, it still produces a lot of primes. It’s known that for n ≤ 10000000, there are 47,5% of primes produced by the formula! So, you’ll write a program that will output how many primes does the formulaoutput for a certain interval.

    Input

    Each line of input will be given two positive integer a and b such that 0 ≤ a ≤ b ≤ 10000. You must read until the end of the file.

    Output

    For each pair a, b read, you must output the percentage of prime numbers produced by the formula in this interval (a ≤ n ≤ b) rounded to two decimal digits. SampleInput

    0 39

    0 40

    39 40

    Sample Output

    100.00

    97.56

    50.00

    最大值是100010041.

    用vector来记录1~sqrt(100010041+0.5)所有的素数。

    然后1到10000进行判断素数进行pp数组的预处理

    ans = pp[b] - pp[a-1]。

    #include <iostream>
    #include <cstdio>
    #include <vector>
    #include <cstring>
    
    using namespace std;
    
    typedef long long LL;
    
    const int N = 1e7+10;
    
    vector<LL> prime;
    bool vis[N];
    int pp[N];
    
    void init(){
        memset(vis,false,sizeof vis);
        for(int i=2;i<=N;i++) if(!vis[i]){
            prime.push_back(i);
            for(int j=i;j<=N;j+=i) vis[j]=true;
        }
        memset(pp,0,sizeof pp);pp[0]=1;
        for(int i=1;i<=10000;i++){
            LL v = i*i + i +41;
            bool cp=false;
            for(int j=0;prime[j]*prime[j]<=v;j++)
            if(v%prime[j]==0) {cp=true;break;}
            if(cp) pp[i]=pp[i-1];
            else pp[i]=pp[i-1]+1;
        }
    }
    
    int main()
    {
        init();int a,b;
        while(~scanf("%d%d",&a,&b)){
            double c ,d;
            if(a) c = pp[b]-pp[a-1],d=b-a+1;
            else c=pp[b],d=b+1;
            double ans = c/d*100;
            ans+=1e-5 ;//这里是4舍5入
            printf("%.2f
    ",ans);
        }
        return 0;
    }
    

      

  • 相关阅读:
    Java 类与类之间的调用
    File类中的list()和listFiles()方法
    关于GITLAB若干权限问题
    JAVA 判断一个字符串是不是一个合法的日期格式
    JAVA日期加减运算
    Java读写文件的几种方法
    在Coding.net创建项目开发
    IntelliJ IDEA 创建项目project和module的关系
    对xml文件的简单解析
    Intellij IDEA使用总结
  • 原文地址:https://www.cnblogs.com/BugClearlove/p/4705360.html
Copyright © 2011-2022 走看看