酷代码 AI
菜单
服务商

揭秘:N 进制数 M 变回文数的最少步数,30 步内见分晓!

```cpp #include <iostream> #include <string> #include <algorithm> // 将字符转换为对应的数值 int charToNum(char c) { if (c >= '0' && c <= '9') { return c - '0'; } return c - 'A' + 10; } // 将数值转换为对应的字符 char numToChar(int num) { if (num < 10) { return num + '0'; } return num - 10 + 'A'; } // 实现N进制加法 std::string add(std::string a, std::string b, int n) { std::string result; int carry = 0; int i = a.size() - 1, j = b.size() - 1; while (i >= 0 || j >= 0 || carry) { int sum = carry; if (i >= 0) { sum += charToNum(a[i]); i--; } if (j >= 0) { sum += charToNum(b[j]); j--; } result.push_back(numToChar(sum % n)); carry = sum / n; } std::reverse(result.begin(), result.end()); return result; } // 判断一个字符串是否是回文串 bool isPalindrome(std::string s) { int left = 0, right = s.size() - 1; while (left < right) { if (s[left] != s[right]) { return false; } left++; right--; } return true; } // 反转字符串 std::string reverseStr(std::string s) { std::string reversed = s; std::reverse(reversed.begin(), reversed.end()); return reversed; } int main() { int n; std::string m; std::cin >> n >> m; int steps = 0; while (steps <= 30) { if (isPalindrome(m)) { std::cout << steps << std::endl; return 0; } std::string reversed = reverseStr(m); m = add(m, reversed, n); steps++; } std::cout << "Impossible" << std::endl; return 0; } ``` 代码说明: 1. `charToNum`函数:将字符转换为对应的数值,对于数字字符,直接转换为对应的整数;对于字母字符,转换为对应的十六进制数值。 2. `numToChar`函数:将数值转换为对应的字符,对于小于10的数值,转换为对应的数字字符;对于大于等于10的数值,转换为对应的十六进制字母字符。 3. `add`函数:实现N进制加法,从低位到高位逐位相加,并处理进位。 4. `isPalindrome`函数:判断一个字符串是否是回文串,通过双指针法比较字符串的首尾字符。 5. `reverseStr`函数:反转字符串。 6. `main`函数:读取输入的进制`n`和N进制数`m`,在30步内不断进行加法操作,直到得到回文数或超过30步。如果在30步内得到回文数,输出步数;否则输出`Impossible`。 ######[AI问答 | 811点数解答 | 2026-02-02 17:44:17]

相关提问
本站限时免费提问中
实用工具查看更多
Linux在线手册 [开发类]
Jquery在线手册 [开发类]
今日油价 [生活类]
图片互转base64 [开发类]
时间转换器 [开发类]