1. 程式人生 > >UVa 1583 Digit Generator 生成元

UVa 1583 Digit Generator 生成元

這道題的意思是,如果一個數x加上他各位數字之和是y,那麼x就是y的生成元
如果沒有生成元,那麼輸出0
題目限定了y的取值範圍是[1,100000],看似數字不大,所以首先想到的是暴力。

for (i = 1; i <= n; i++)
	{
		temp = 0;
		temp2 = i;
		while (temp2 != 0)
		{
			temp += temp2 % 10;
			temp2 /= 10;
		}
		if(temp+i==n)
		{
			printf("%d\n",i);
			break;
		}
	}

這種做法可以,但是這種方法太慢了,每次計算一個數的生成元,最差的情況是遍歷小於n的所有的數,一旦測試資料一多,那麼超時是非常容易的事情。
那有沒有什麼方法可以只遍歷一次就能把每個數的生成元求出來呢?
因為題目解法很單一,而且很難優化,所以我們可以打表
因此,從頭遍歷1~100000的所有數所能構成的最小生成元,並將其儲存在陣列中。

for(i=0;i<=100000;i++)

當i等於198時,經過計算他是216的生成元,於是我們將資料以如下方式儲存

//i=198,temp是各個位上數字之和
ans[i+temp]=i;

因此,此方法只需要遍歷一遍便可以將所有生成元儲存在陣列中
下面是AC程式碼

#include <cstdio>
int ans[100010] = { 0 };
int main()
{
	int i, n;
	int target, temp2;
	scanf("%d", &n);
	for (i = 1; i <= 100000; i++)
	{
		int temp = 0;
temp2 = i; while (temp2 != 0) { temp += temp2 % 10; temp2 /= 10; } if (ans[temp + i] == 0) ans[temp + i] = i; } while (n--) { scanf("%d", &target); printf("%d\n", ans[target]); } }