打表,就是在做题时怎么也想不到怎样做,从而用暴力的方法将可能发生的情况全部储存,从而在一定时间内跑出所有与输入相匹配的答案。在一定的条件下,打表可以减少运行时间、提高效率。
就比如这一题
欧拉是一位著名的材料学家,他发现公式n2+n+41产生了一个0≤n<40的素数。对于n=40,公式产生1681,即41*41。尽管这个公式并不总是产生素数,但它仍然产生很多素数。
已知n≤10000000时,有47,5%的素数由公式产生!所以,您将编写一个程序,输出公式在特定时间间隔内输出的素数。 输入
每行输入将被赋予两个正整数a和b,使得0≤a≤b≤10000。你必须一直读到最后。
输出
对于每对a,b read,您必须输出此区间(a≤n≤b)内由公式产生的质数的百分比,四舍五入为两位小数。
样本输入
0 39
0 40
39 40
样本输出
100.00
97.56
50.00
代码如下:
#include<stdio.h>
#include<math.h>
int A[11000000];
int su(int x)//判断素数
{
int a=sqrt(x);
int i;
for(i=2;i<=a;i++){
if(x%i==0)
break;
}
if(i==a+1)
return 1;
else
return 0;
}
int main()
{
/////打表
for(int i=0;i<11000000;i++){
int q=pow(i,2)+i+41;
if(su(q))
A[i]=1;
else
A[i]=0;
}
//////打表
double m,n;
while(~scanf("%lf %lf",&m,&n))
{
double t;
if(m>n)
{
t=m;m=n;n=t;
}
double sum=0;
//表示已知答案,直接从答案中提取数据
for(int i=m;i<=n;i++){
sum+=A[i];
}
//
double e=sum/(n-m+1)*100;
printf("%.2lf\n",e+0.0000001);//+0.0000001表示高精度
}
}