Uva-10200 Prime Time【素数+打表+浮点精度】

    xiaoxiao2025-02-16  14

    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 formula output 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.

    Sample Input

    0 39 0 40 39 40

    Sample Output

    100.00 97.56 50.00

    题意:欧拉函数:f(n)=n*n+n+41 在给定区间内判定的素数发生率;思路:数据量大,打个表解决,但是不可能打10^8的素数表 所以可以一个一个判定 也不会超过1秒,枚举每一个n,计算出结果,判定就行,最后可以在打一个区间表;失误:这一题有精度判断,第一次遇到,这种一般还真不注意,可能会成为一道题的障碍,这也说明了用浮点型要注意精度,int 防止溢出!代码如下: #include<cstdio> using namespace std; const int MAXN=1e4+10; int prime[MAXN]; int main() { int i,j,a,b,s; for(i<=0;i<=10000;++i)//不要看到数很大就不敢写了 打表就是处理大数据的 行不行也要试一试才知道 { //再说分析一下也达不到10^8 s=i*i+i+41; prime[i]=1; for(j=2;j*j<=s;++j) { if(s%j==0) { prime[i]=0; break; } } } for(i=1;i<=10000;++i) prime[i]+=prime[i-1];//区间表 while(~scanf("%d %d",&a,&b)) { double ans=(prime[b]-prime[a-1])*1.0/(b-a+1); printf("%.2lf\n",ans*100+1e-8);//防止误差 一般选1e-8 但有时根据题意判断 } return 0; }
    转载请注明原文地址: https://ju.6miu.com/read-1296493.html
    最新回复(0)