2 条题解
-
0
#include<bits/stdc++.h> using namespace std; int n; string m; // 存一个高精度的数 int len, d[205]; // 颠倒相加 void diandaoxiangjia(){ for(int i=0,j=len-1; i<=j; i++,j--){ int now = d[i]+d[j]; d[i] = now; d[j] = now; } for(int i=0;i<=len-2;i++) { d[i+1]+=d[i]/n; d[i]%=n; } while(d[len-1]>=n) { d[len]=d[len-1]/n; d[len-1]%=n; len++; } } // 是否回文 bool shifouhuiwen(){ for(int i=0;i<len;i++) if(d[i]!=d[len-1-i]) return false; return true; } int main(){ cin>>n>>m; len=m.size(); for(int i=0;i<len;i++){ if('0'<=m[len-1-i] && m[len-1-i]<='9') d[i] = m[len-1-i]-'0'; else d[i] = m[len-1-i]-'A'+10; } if(shifouhuiwen()) { cout<<"STEP=0\n"; return 0; } for(int i=1;i<=29;i++){ diandaoxiangjia(); if(shifouhuiwen()) { cout<<"STEP="<<i<<"\n"; return 0; } } cout<<"Impossible!"; return 0; }
-
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
- 难度
- 8
- 标签
- 递交数
- 22
- 已通过
- 6
- 上传者