打表法简单举例

       有时候在数据太多的时候且要多次循环的时候,可以选择打表法,编程效率大大提高,下面简单介绍一下打表法

打表法,顾名思义,就是把一些数据打印出来,存放到数组里,需要的时候直接调用就行,就不必多次循环了。

例:如果x加上x的各个位数上的数字之和得到y,就说x是y的生成元。给出n(1<<n<<100000),求最小生成元,无解输出0.例如n=216,121,2005时的解分别为198,0,1997.

下面看看代码

#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#define num 10005
int ans[num];
int main()
{
	int T, n, i;
	memset(ans, 0, sizeof(ans));
	for (int m = 1; m < num; m++)
	{
		int x = m, y = m;
		while (x > 0)
		{
			y = y + x % 10;
			x = x / 10;
		}
		if (ans[y] == 0 || m < ans[y])
		{
			ans[y] = m;
		}
	}
	scanf("%d", &T);
	for (i = 0; i < T; i++)
	{
		scanf("%d", &n);
		printf("%5d", ans[n]);
	}
	printf("\n");
	system("pause");
	return 0;
}

先把生成元x(1<<x<<100000)对应的数y求出来,以y为下标,x为下标对应的元素,需要时直接调用就可以了。

有人可能不理解为什么要这一条件ans[y] == 0 || m < ans[y],这是保证求出来的是最小生成元,例如216的生成元有198、207,先求出来的是198,如果没有m<ans[y]这个条件,求出来的就是207,而不是198了。这就是打表法,我举的例子比较简单,大家可以自己多查查有关资料。

猜你喜欢

转载自blog.csdn.net/weixin_44341938/article/details/88312762