题意:如果x加上x的各个数字之和得到y,就说x是y的生成元。给出n(1≤n≤100000),求最小生成元。无解输出0。例如,n=216,121,2005时的解分别为198,0,1979。
分析:枚举肯定超时,不如先打表,把100000内的数的最小生成元全部找出来先,存入数组。
我的代码:
#include <bits/stdc++.h>
using namespace std;
int main()
{
int ans[100005],t,n,i;
memset(ans,0,sizeof(ans));
for(i=1;i<=100005;i++)
{
int temp=i,dig=temp;
while(dig>0) {temp+=dig%10; dig/=10;}
if (ans[temp]==0 || i<ans[temp]) ans[temp]=i;
}
for(scanf("%d",&t);t;t--)
{
scanf("%d",&n);
printf("%d\n",ans[n]);
}
return 0;
}
作者示范代码:
// UVa1583(LA3355) Digit Generator
// Rujia Liu
#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;
}