题目描述:
题目描述: 如果x加上x的各个数字之和得到y,也就是说x是y的生成元。给出n(1<=n<=100000),求最小生成元。无解则输出0。
分析:
因为要求最小的生成元,所以我们可以设最小生成元为 i 。
我们看几个例子:
2005的生成元:1979
216的生成元:198
2019的生成元:1995
不难发现, i 是小于 n 的。所以我们只需要枚举1…n,看看有没有那个数是n的生成元。
为了更快,我们可以一次性枚举到 n 的最大值,把每个 n 的生成元存在 a 数组中,等到输入 n 时直接输出 a[n] 即可。
代码:
#include<bits/stdc++.h>
using namespace std;
int T;
int n;
int a[1000000];
int main()
{
for(int i=1;i<100002;i++)//枚举(n 的最大值可以开大一点)
{
int x=i,y=i;//x 为当前这个数,y 为这个数各位之和
while(x)//x>0
{
y=y+x%10;
x=x/10;
}
if(a[y]==0||i<a[y])//如果更小,刷新
{
a[y]=i;
}
}
cin>>T;
while(T--)
{
cin>>n;//输入 n
cout<<a[n]<<endl;//输出
}
return 0;
}