演算法競賽入門經典-例題3-5-生成元
阿新 • • 發佈:2018-12-21
題目描述
生成元(Digit Generator, ACM/ICPC Seoul 2005, UVa1583)
如果x加上x的各個數字之和得到y,就說x是y的生成元。給出n(1≤n≤100000),求最小生成元。無解輸出0。例如,n=216,121,2005時的解分別為198,0,1979
分析
- 思路一:假設所求生成元為m。不難發現m<n。換句話說,只要列舉所有的m<n,看看有沒有哪個數是n的生成元。
- 只需要一次性列舉100000內的所有正整數m,標記“m加上m的各個數字之和得到的數有一個生成元是m”,最後查表。
#include<stdio.h>
#include< string.h>
#define maxn 100005
int ans[maxn];
int main()
{
int T,n;
memset(ans, 0,sizeof(ans));
for(int m=1;m<maxn;m++)
{
int x=m,y=m;
while(x>0)
{
y+=x%10;
x/=10;
}
if(ans[y]==0||m<ans[y]) ans[y]=m;
}
scanf("%d",&T);
while(T--)
{
scanf("%d",&n);
printf("%d\n" ,ans[n]);
}
return 0;
}