如果x加上x的各个数字之和得到y,就说x是y的生成元。给出n(1≤n≤100000),求最小
生成元。无解输出0。例如,n=216,121,2005时的解分别为198,0,1979。
这是他的题目,不过我的程序跑起来后,算出216的最小生成元是207.而不是198
//--------------我写的--------------: #define _CRT_SECURE_NO_WARNINGS #include <stdio.h> int panduan(int Num) { for (int i = 1; i < Num; i++) { int m = Num - i; int g = 0, s = 0, b = 0, q = 0, w = 0, sum = 0; g = m % 10; sum = g; if (m >= 10) { s = m / 10 % 10; sum += s; if (m >= 100) { b = m / 100 % 10; sum += b; if (m >= 1000) { q = m / 1000 % 10; sum += q; if (m >= 10000) { w = m / 10000 % 10; sum += w; if (m = 100000) sum += 1; } } } } if (sum == i) return m; } return 0; } int main() { int num, D_a; printf("请输入一个数字: "); scanf("%d", &num); if (num > 100000); else D_a=panduan(num); printf("n=%d时,最小生成元是:%d", num, D_a); system("pause"); } //-------------别人写的-------------: #define _CRT_SECURE_NO_WARNINGS #include <stdio.h> #include <string.h> #define maxn 100005 int array[maxn]; int main() { int T, n; memset(array, 0, sizeof(array));
//它是将每一个数的最小生成元求出来放到该数的数组中 for (int m = 1; m < maxn; m++) { int x = m, y = m; while (x > 0) { y += x % 10; x /= 10; } if (array[y] == 0 || m < array[y]) array[y] = m; } scanf("%d", &T); //想要查几个数 while (T--) { scanf("%d", &n); printf("%d ", array[n]); } }