1 条题解
-
0
#include <bits/stdc++.h> using namespace std; const int LEN = 300 + 30; int N; // 进制数 string M; int step; int mLen; int m[LEN + 5]; // 检查 m[0]~m[mLen-1] 是否回文 bool check() { for (int i = 0, j = mLen - 1; i < j; i++, j--) if (m[i] != m[j]) return false; return true; } int main() { cin >> N; cin >> M; // M 翻转并转换为对应的数字 mLen = M.size(); for (int i = 0; i < mLen; i++) { if ('0' <= M[i] && M[i] <= '9') m[mLen - i - 1] = M[i] - '0'; if ('A' <= M[i] && M[i] <= 'F') m[mLen - i - 1] = M[i] - 'A' + 10; } // 循环执行直到回文或者 30 步为止 for (step = 0; step < 30 && !check(); step++) { // 颠倒相加 for (int i = 0, j = mLen - 1; i <= j; i++, j--) { int now = m[i] + m[j]; m[i] = m[j] = now; } // 进位 for (int j = 0; j < mLen - 1; j++) { m[j + 1] += m[j] / N; m[j] %= N; } // 最高位尝试扩展 while (m[mLen - 1] > N - 1) { m[mLen] = m[mLen - 1] / N; m[mLen - 1] %= N; mLen++; } } // 输出 if (step >= 30) cout << "Impossible!"; else cout << "STEP=" << step; return 0; }
- 1
信息
- ID
- 13416
- 时间
- 1000ms
- 内存
- 128MiB
- 难度
- 10
- 标签
- 递交数
- 1
- 已通过
- 1
- 上传者