生成元:如果 x 加上 x 各个数字之和得到y,则说x是y的生成元。
n(1<=n<=100000),求最小生成元,无解输出0.
例如:n=216 , 解是:198
198+1+9+8=216
解题思路:打表
循环将从1到10005(大点也可以)进行提前写好。
例如:
1 1+1=2,--> arr[2]=1
13 13+1+3=17,-->arr[17]=13
34 34+3+4=41, -->arr[41]=34
打完表后,直接将给的数作为下标,输出即可。
#include<stdio.h> #include<string.h> #define maxn 100005 int main(void) { int t,n,i,j,m,ans[maxn]; memset(ans,0,sizeof(ans)); for(m=1; m<maxn; m++) { i=j=m; while(i>0) { j+=i%10; i/=10; } if(ans[j]==0||m<ans[j])ans[j]=m; } scanf("%d",&t); while(t--) { scanf("%d",&n); printf("%d\n",ans[n]); } return 0; }
if(ans[j]==0||m<ans[j])ans[j]=m;//如果ans[j]没有被赋值,或者当前的m<ans[j](写入最小生成元)。
时间: 2024-11-09 05:09:28