7-9 1.2.5 双重回文数 (70分)

    技术2022-07-11  137

    如果一个数从左往右读和从右往左读都是一样,那么这个数就叫做“回文数”.例如,12321 就是一个回文数,而 77778 就不是.

    当然,回文数的首和尾都应是非零的,因此 0220 就不是回文数. 事实上,有一些数(如 21),在十进制时不是回文数,但在其它进制(如二进制时为 10101)时就是 回文数.

    编一个程序,读入两个十进制数 N (1 <= N <= 15) S (0 < S < 10000)

    然后找出前 N 个满足大于 S 且在两种以上进制(二进制至十进制)上是回文数的十进制数,输出到 文件上.

    本问题的解决方案不需要使用大于 4 字节的整型变量.

    输入格式: 只有一行,用空格隔开的两个数 N 和 S.

    输出格式: N 行, 每行一个满足上述要求的数,并按从小到大的顺序输出.

    输入样例1: 在这里给出一组输入。例如:

    3 25

    输出样例1: 在这里给出相应的输出。例如:

    26 27 28

    输入样例2:

    9 10

    输出样例2:

    15 16 17 18 20 21 24 26 27

    输入样例3:

    15 9900

    输出样例3:

    9958 10252 10308 10658 10794 10858 10922 10986 11253 11314 11757 11898 11950 12291 12355


    【源代码】

    #include <iostream> #include <vector> #include <string> #include <algorithm> using namespace std; bool Palin_num(const string a) // 回文数判断函数,使用字符串判断法:回文数关于中心对称,只要比较对称的数即可; { int length; length = a.length(); int flag = 1; for (int i = 0; i <= (length / 2); i++) { if (a[i] != a[length - i - 1]) { flag = 0; break; } } if (flag == 1) // 是回文数; { return true; } else { return false; } } string intToA(int n, int radix) //进制转换函数,n是待转数字,radix是指定的进制 { string ans = ""; do { int t = n % radix; if (t >= 0 && t <= 9) { ans += t + '0'; } else { ans += t - 10 + 'A'; } n /= radix; } while (n != 0); // 使用do{}while()以防止输入为0的情况 reverse(ans.begin(), ans.end()); return ans; } int main() { int n, s; cin >> n >> s; s++; //双重回文数要大于s,从s+1开始遍历; vector<int> p; // 容器p,存放双重回文数; int sum; // 记录有几种进制的数是回文数; while ((p.size() < n)) // 根据容器p里双重回文数的个数决定是否终止程序; { sum = 0; for (int i = 2; i <= 10; i++) { if (Palin_num(intToA(s, i))) // 此时对应进制的数是回文数; { sum++; // 记录次数+1; } } if (sum >= 2) // 双重回文数,压入容器p中; { p.push_back(s); } s++; // 继续遍历; } for (int i = 0; i < p.size(); i++) { cout << p[i] << endl; } return 0; }
    Processed: 0.009, SQL: 9