1 条题解
-
4
#include <bits/stdc++.h> using namespace std; // ==================== // 字符与数值转换函数 // ==================== // 将字符 c 转换为对应的整数值 // '0'~'9' -> 0~9 // 'A'~'F' -> 10~15 int charToInt(char c) { if (c >= '0' && c <= '9') return c - '0'; // 数字字符直接减 '0' return c - 'A' + 10; // 大写字母转换为 10~15 } // 将数值 x 转换为对应的字符 // 0~9 -> '0'~'9' // 10~15 -> 'A'~'F' char intToChar(int x) { if (x < 10) return x + '0'; // 小于 10 用数字字符表示 return x - 10 + 'A'; // 大于等于 10 用大写字母表示 } // ==================== // 判断回文函数 // ==================== bool isPalindrome(const string &s) { int l = 0; // 左指针,从字符串开头 int r = s.length() - 1; // 右指针,从字符串末尾 while (l < r) { // 当左指针小于右指针时继续检查 if (s[l] != s[r]) // 两端字符不相等,不是回文 return false; l++; // 左指针向右移动 r--; // 右指针向左移动 } return true; // 所有对应字符都相等,是回文 } // ==================== // N 进制高精度加法函数 // ==================== string add(string a, string b, int N) { int lena = a.length(); // a 的长度 int lenb = b.length(); // b 的长度 int maxLen = max(lena, lenb) + 1; // 结果最多比最大长度多 1 位 string res(maxLen, '0'); // 创建结果字符串,初始全为 '0' // 用下标从后往前填结果 int i = lena - 1; // 指向 a 的末位(最低位) int j = lenb - 1; // 指向 b 的末位(最低位) int k = maxLen - 1; // 指向 res 的末位(最低位) int carry = 0; // 进位初始化为 0 // 竖式加法,从最低位开始逐位计算 while (i >= 0 || j >= 0) { int x = 0, y = 0; if (i >= 0) { x = charToInt(a[i]); i--; } // a 当前位的值 if (j >= 0) { y = charToInt(b[j]); j--; } // b 当前位的值 int sum = x + y + carry; // 当前位相加 + 进位 res[k] = intToChar(sum % N); // 当前位存结果,按 N 进制取模 carry = sum / N; // 计算进位,整除 N k--; // 指向 res 的下一位(左移) } // 处理最后的进位,如果还有进位就放到最高位 if (carry != 0) res[k] = intToChar(carry); // 进位存到最高位 else k++; // 没有进位,最前面多余的 '0' 跳过 return res.substr(k); // 返回有效部分 } // ==================== // 主函数 // ==================== int main() { int N; // 进制 string M; // 输入数字(N 进制表示) cin >> N >> M; // 从标准输入读取 // 最多 30 步 for (int step = 0; step <= 30; step++) { // 第 0 步也要判断是否已经是回文 if (isPalindrome(M)) { cout << step << endl; // 输出步数 return 0; // 程序结束 } // 超过 30 步仍然没有回文,结束循环 if (step == 30) break; // 手动生成 M 的反转字符串 int len = M.length(); string rev(len, '0'); // 创建长度为 len 的字符串 for (int i = 0; i < len; i++) { rev[i] = M[len - 1 - i]; // 逐位倒置 } // 将原数与反转数相加(高精度 N 进制) M = add(M, rev, N); } // 30 步内无法得到回文数 cout << "Impossible" << endl; return 0; }
- 1
信息
- ID
- 383
- 提交时间
- 1000ms
- 内存
- 256MiB
- 难度
- 2
- 标签
- 递交数
- 43
- 已通过
- 9
- 上传者
冀公网安备13098402000493号