UVa 1583 Digit Generator 生成元
阿新 • • 發佈:2018-11-16
這道題的意思是,如果一個數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]);
}
}