2 条题解
-
0
标准方法1:
#include <bits/stdc++.h> using namespace std; // 函数:判断一个字符串是否是回文数 bool isPal(const string& s) { int len = s.length(); for (int i = 0; i < len / 2; ++i) { if (s[i] != s[len - 1 - i]) { return false; // 如果不是回文数,返回 false } } return true; // 是回文数,返回 true } // 函数:计算N进制两个数相加 string addBase(const string& num1, const string& num2, int base) { int carry = 0; int i = num1.length() - 1, j = num2.length() - 1; string res; while (i >= 0 || j >= 0 || carry) { int d1 = (i >= 0) ? (num1[i] - '0') : 0; int d2 = (j >= 0) ? (num2[j] - '0') : 0; int sum = d1 + d2 + carry; res.push_back(sum % base + '0'); // 当前位的结果 carry = sum / base; // 更新进位 --i; --j; } reverse(res.begin(), res.end()); // 结果需要反转 return res; } int main() { int base; string num; cin >> base >> num; int steps = 0; while (steps <= 30) { if (isPal(num)) { cout << steps << endl; // 输出步骤数 return 0; } string rev = num; reverse(rev.begin(), rev.end()); // 获取逆序数 num = addBase(num, rev, base); // 进行加法 ++steps; } cout << "Impossible" << endl; // 超过30步仍未得到回文数 return 0; } -
0
#include <bits/stdc++.h> using namespace std; int n, steps = 0; vector<int> a, b; // 高精度加法函数:将a和b两个N进制数相加,并更新a void add(vector<int>& a, const vector<int>& b) { int carry = 0; // 进位 // 遍历a数组,将a和b相加 for (int i = 0; i < a.size(); i++) { if (i < b.size()) { // 如果b还有对应位 a[i] += b[i] + carry; // 加上进位 } else { // 如果b的位数小于a a.push_back(b[i] + carry); // 把b的剩余位加到a } carry = a[i] / n; // 更新进位 a[i] %= n; // 当前位的结果 } if (carry) a.push_back(carry); // 如果最后有进位,添加到末尾 } // 判断一个数是否是回文数 bool is_pal(const vector<int>& a) { int i; // 比较前后对应的数字 for (i = 0; i < a.size() / 2; i++) { if (a[i] != a[a.size() - i - 1]) return false; // 如果不相等,返回false } return true; // 是回文数,返回true } // 将数字倒序存储 void rev_num(const vector<int>& a) { b = vector<int>(a.rbegin(), a.rend()); // 使用反向迭代器将a反转并存入b } // 输出N进制的数字 void print(const vector<int>& a) { for (int i = a.size() - 1; i >= 0; i--) { if (a[i] < 10) cout << a[i]; // 输出0-9 else cout << char(a[i] - 10 + 'a'); // 输出a-f } cout << endl; // 换行 } int main() { string str; cin >> n >> str; // 输入进制n和数字str // 处理输入,将数字转为N进制数组a a.clear(); // 清空数组a for (int i = str.size() - 1; i >= 0; i--) { if (isdigit(str[i])) { // 如果是数字字符 a.push_back(str[i] - '0'); // 转换为数字并放入a } else if (isalpha(str[i])) { // 如果是字母字符 a.push_back(tolower(str[i]) - 'a' + 10); // 转换为数字(a-f -> 10-15) } } // 循环,直到得到回文数或超过30步 while (!is_pal(a)) { // 如果不是回文数 rev_num(a); // 反转a add(a, b); // a与反转后的b相加 steps++; // 步数增加 if (steps > 30) break; // 如果超过30步,退出循环 } // 判断是否超过30步 if (steps > 30) { cout << "Impossible" << endl; // 如果超过30步,输出"Impossible" } else { cout << steps << endl; // 否则输出步骤数 } return 0; // 程序结束 }
- 1
信息
- ID
- 787
- 时间
- 1000ms
- 内存
- 256MiB
- 难度
- 9
- 标签
- 递交数
- 11
- 已通过
- 4
- 上传者