题目:
如果x加上x的各个数字之和得到y,就说x是y的生成元。给出n(1≤n≤100000),求最小生成元。无解输出0。例如,n=216,121,2005时的解分别为198,0,1979。
自己的思路直接枚举:
- #include<stdio.h>
- int main()
- {
- int n;//1<=n<=100000
- while(scanf("%d",&n)!=EOF){
- for(int x=1;x<=n;x++){
- int i=x;
- int sum=x;
- while(i>0){
- sum+=i%10,i/=10;}
- if(sum==n){
- printf("%d\n",x);
- break;}
- if(x==n)
- printf("0\n");
- }
- }
- return 0;
- }
这个代码也出了好多问题:
如果将中间这里改成这样,将无法运行。
我还没有找到错误原因,自我理解是,输出i不是变量,无法输出。
for(int x=1;x<=n;x++){int i=x;int sum=x;while(x>0){sum+=x%10,x/=10;}if(sum==n){printf("%d\n",i);break;}if(i==n)printf("0\n");}
更好的解决方法:
一次性枚举100000内的所有正整数m,标记“m加上m的各个数字之和得到的数有一个生成元是m”,最后查表即可。
- #include<stdio.h>
- #include<algorithm>
- #define maxn 100005
- int a[maxn];
- int main()
- {
- int n;
- memset(a,0,sizeof(a));
- for(int x=1;x<maxn;x++)
- {
- int i=x;
- int sum=x;
- while(i>0){
- sum+=i%10,i/=10;}
- if(a[sum]==0||x<a[sum])
- a[sum]=x;//保证最小
- }
- while(scanf(" %d",&n)){
- printf("%d\n",a[n]);}
- return 0;
- }