题目链接:https://vjudge.net/problem/UVA-10200
题目大意:
给定f(n)= n^2+n+41
求n∈[a,b],有多少n满足f(n) 为质数,输出其所占百分比
分析:
数据量不大,试除法判断是否为素数并打表即可。
注意点:题目要求四舍五入(rounded to two decimal digits)
因为double类型的精度问题,一个理论值为0.0500000000000的值可能会被算成0.49999999999999,所以给答案加上eps常量以抹除误差
eps是epsilon的缩写,即希腊字母ε,常用来表示无穷小(想起了高中物理老师经常把它读成E普赛隆2333)
ACM中eps常量一般取1e-8
代码:
#include <iostream>
#include <cstdio>
#include <algorithm>
#define eps 1e-8
using namespace std;
int num[10005];
bool Isprime[10005];
void excel(){
for(int i=0;i<40;i++) Isprime[i]=1,num[i]=i+1;
for(long long i=40;i<=10000;i++){
num[i]=num[i-1];
long long t=i*i+i+41;
int flag=1;
for(int j=2;j*j<=t;j++)
if(t%j==0) {flag=0; break;}
if(flag) Isprime[i]=1,num[i]++;
}
}
int main()
{
excel();
int a,b;
while(~scanf("%d%d",&a,&b)){
int n=num[b]-num[a];
if(Isprime[a]) n++;
double ans=(double)n*100/(1.0*(b-a+1));
printf("%.2f\n",ans+eps);
}
return 0;
}