题意翻译
题目描述: 如果x加上x的各个数字之和得到y,也就是说x是y的生成元。给出n(1<=n<=100000),求最小生成元。无解则输出0。
输入输出样例
输入
3
216
121
2005
输出
198
0
1979
思路
建立一个大小为100005的数组,数组大小可以适当大一点.然后在数组里存对应的最小生成元.数组初始化为0.
从小到大枚举,从1开始,到100000,1可以生成2,2可以生成4,如果生成的大小超过100000,就跳过,同时也需要判断最小值.
总体思路为打表法.
代码
#include <stdio.h>
#include <string.h>
// 大小比较大的数组,需要定义在主函数外面.
int arr[100005];
int main() {
memset(arr, 0, sizeof(int) * 100005);
for (int i = 1; i <= 100000; i++) {
int m = 0;
int sum = 0;
int temp = i;
// 计算每个数字加起来的和
while (temp > 0) {
m = temp % 10 + m;
temp = temp / 10;
}
sum = m + i;
if (sum > 100000) {
continue;
}
if (arr[sum] == 0 || i < arr[sum])
arr[sum] = i;
}
int count;
scanf("%d", &count);
while (count--) {
int test;
scanf("%d", &test);
printf("%d\n", arr[test]);
}
return 0;
}
总结
- 大小比较大的数组应该定义在主函数外面,定义在主函数内会出现异常错误.
- 计算每个数字的和,可以用一个循环语句来计算.
- 新的方法,打表法.