题目具体描述见:https://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&page=show_problem&problem=4458
分析:构建一个数组,用来枚举100000以内的所有生成元,数组元素全部初始为0,枚举之后,数组中元素即为对应下标的生成元,通过访问数组下标即可直接得到需要求解的生成元
比如: num[216]的值为198,即为216的生成元为198; num[121]的值为0,即为121没有生成元
C++11代码如下:
1 #include<iostream> 2 #include<string.h> 3 #define maxn 100002 4 using namespace std; 5 int num[maxn]; //数组过大,需定义在main函数外 6 int main() { 7 int T, n; 8 memset(num, 0, sizeof(num )); //数组元素全部设置为0 9 for (int m = 1; m < maxn; m++) { //枚举100000以内的所有生成元 10 int x = m, y = m; 11 while (x > 0) { 12 y += x % 10; 13 x /= 10; 14 } 15 if (num[y] == 0) num[y] = m; 16 } 17 cin >> T; 18 while (T--) { 19 cin >> n; 20 cout << num[n]<<endl; 21 } 22 return 0; 23 }