uva10200(Prime Time) 卡精度

分析:题目给出一个公式f(n)=n*n+n+41,输入a和b,0<=a<=b<=10000,

问在区间[a,b]中满足f(k)是素数的数所占的百分比。

b的范围不大,直接暴力素数打表即可。

最后输出保留两位小数,卡精度,必须在结果加上1e-5(或者更小)保证精度。

例如,输入 6000 9999,不加1e-5输出37.67(真实值为37.675),加上1e-5输出37.68。

#include<cstdio>
bool a[100010042];
void f()
{
    for(int i=4;i<100010042;i+=2) a[i]=1;
    for(int i=3;i<100010042;i++)
    {
        if(a[i]==0)
        {
            for(int j=i+i;j<100010042;j+=i)
            a[j]=1;
        }
    }
}
int ans[10011];
int main()
{
    f();ans[0]=1;
    for(int i=1;i<10001;i++)
    {
        if(!a[i*i+i+41])
        ans[i]=1;
        ans[i]+=ans[i-1];
    }
    int a,b;
    while(scanf("%d%d",&a,&b)!=-1)
    if(a==0)
        printf("%.2lf
",100*(double)ans[b]/((b+1)*1.0)+1e-5);
    else 
        printf("%.2lf
",100.0*(1.0*(ans[b]-ans[a-1]))/(1.0*(b-a+1))+1e-5);
    return 0;
}
View Code
原文地址:https://www.cnblogs.com/ACRykl/p/8626865.html