題目
如果x加上x的各個數字之后得到y,就說x是y的生成元。給出n(1<=n<=100000),
求最小生成元。無解輸出0。例如,n=216,121,2005時的解分別為198,0,1979。
分析
假設所求生成元為m。不難發現m<n。即只需枚舉所有的m<n,看看有沒有哪個數是n的生成元。
但是,這樣做效率較低。因為每一次計算一個n的生成元都需要枚舉n-1個數。
更好的方法;我們可以一次枚舉100000內的所有正整數m,標記“m加上m的各個數字之和得到的數有一個生成元是m”,最后查表即可。
c實現
#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; } //這里直接一次枚舉100000以內的所有整數,之后通過查表取出結果。 //避免每次求n的生成元,都需要枚舉n-1個數
這里的T指的是進行多少次查詢。
效果