生成元(UVa1583)

  题目具体描述见: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 }

猜你喜欢

转载自www.cnblogs.com/pgzhang/p/9225131.html