打表的认识

打表,就是在做题时怎么也想不到怎样做,从而用暴力的方法将可能发生的情况全部储存,从而在一定时间内跑出所有与输入相匹配的答案。在一定的条件下,打表可以减少运行时间、提高效率。
就比如这一题

欧拉是一位著名的材料学家,他发现公式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表示高精度
	}
}
ZL0
发布了15 篇原创文章 · 获赞 0 · 访问量 223

猜你喜欢

转载自blog.csdn.net/ZL0_bo/article/details/105309407