Problem Description
Euler is a well-known matematician, and, among many other things, he discovered that the formula
n
2
+
n
+
41
n^{2} + n + 41
n2+n+41 produces a prime for
0
≤
n
<
40
0 ≤ n < 40
0≤n<40. For
n
=
40
n = 40
n=40, the formula produces
1681
1681
1681, which is
41
∗
41
41 ∗ 41
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
n ≤ 10000000
n≤10000000, there are
47
,
5
47,5
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 a a and b b b such that 0 ≤ a ≤ b ≤ 10000 0 ≤ a ≤ b ≤ 10000 0≤a≤b≤10000. You must read until the end of the file.
Output
For each pair
a
,
b
a, b
a,b read, you must output the percentage of prime numbers produced by the formula in
this interval
(
a
≤
n
≤
b
)
(a ≤ n ≤ b)
(a≤n≤b) rounded to two decimal digits.
Sample Input
0 39
0 40
39 40
Sample Output
100.00
97.56
50.00
题意:
输入数据a和b,求a和b之间数经过 n 2 + n + 41 n^{2}+n+41 n2+n+41为素数的所占比值保留两位小数;
思路:
数据范围 0 0 0 到 10000 10000 10000啊~~~, 懂 ! ! ! ! !!!! !!!! _(:зゝ∠)_而且卡精度卡到死 1 0 − 6 10^{-6} 10−6真***恶心~~~~(>—<)~~~~;
主要进行素数打表(这是关键)o(︶︿︶)o 唉(在这上面错了N次)不说了,说多了都是泪φ(≧ω≦*)♪;
看代码:
#include<iostream>
#include<cstdio>
#include<cstring>
using namespace std;
#define ll long long
const int N=100100;
bool isprime[N];
bool Prime(int a)//判定素数
{
for(int i=2; i*i<=a; i++)
if(a%i==0)
return false;
return true;
}
void Isprime()//进行打表
{
for(int i=0; i<N; i++)
{
if(Prime(i*i+i+41))
isprime[i]=true;
else
isprime[i]=false;
}
}
int main()
{
Isprime();
int a,b;
while(cin>>a>>b)
{
int s=0;
for(int i=a; i<=b; i++)
{
if(isprime[i])
s++;//记录个数;
}
double z=(double)s/(double)(b-a+1)*100+0.00000001;//卡精度
printf("%.2lf\n",z);
}
return 0;
}