求助,这道题不能先把数字转换为十进制再进行计算吗?
我的代码
#include <iostream>
#include <cstring>
#include <cmath>
#include <algorithm>
using namespace std;
int n;
string m;
namespace bignum {
// 高精度加法
string add(string a, string b) {
int na[105], nb[105], nc[1005];
int lena = a.length(), lenb = b.length();
memset(na, 0, sizeof(na));
memset(nb, 0, sizeof(nb));
memset(nc, 0, sizeof(nc));
for (int i = 1; i <= lena; i++) na[i] = a[lena - i] - '0';
for (int i = 1; i <= lenb; i++) nb[i] = b[lenb - i] - '0';
for (int i = 1; i <= lena + lenb; i++) {
nc[i] += na[i] + nb[i];
if (nc[i] >= 10) {
nc[i + 1]++;
nc[i] -= 10;
}
}
int lenc = lena + lenb + 1;
while (lenc > 0 && nc[--lenc] == 0);
char s[1005];
memset(s, 0, sizeof(s));
for (int i = lenc; i >= 1; i--)
s[lenc - i] = nc[i] + '0';
return s;
}
}
// 进制转换
namespace todec {
string dec(int n, string m) {
int a;
int dec = 0, cur = 0;
string s;
for (int i = m.length() - 1; i >= 0; i--) {
if (n == 16) {
switch (m[i]) {
case 'A':
a = 10;
break;
case 'B':
a = 11;
break;
case 'C':
a = 12;
break;
case 'D':
a = 13;
break;
case 'E':
a = 14;
break;
case 'F':
a = 15;
break;
default:
a = m[i] - '0';
}
} else {
a = m[i] - '0';
}
dec += a * pow(n, cur++);
}
s = to_string(dec);
return s;
}
}
namespace huiwen {
bool ishuiwen(string a) {
int len = a.length();
int half = len / 2;
for (int i = 0; i < half; i++) {
if (a[i] != a[a.length() - i - 1]) return false;
}
return true;
}
string fz(string a) {
char temp[105];
memset(temp, 0, sizeof(temp));
for (int i = a.length() - 1; i >= 0; i--) {
temp[i] = a[a.length() - i - 1];
}
return temp;
}
}
int main() {
cin >> n >> m;
// 转换为十进制
string tempdec = todec::dec(n, m);
// 翻转回文串
int total = 0;
while (!huiwen::ishuiwen(tempdec)) {
total++;
if (total > 30) {
cout << "Impossible!" << endl;
return 0;
}
// 翻转并相加
tempdec = bignum::add(tempdec, huiwen::fz(tempdec));
}
cout << "STEP=" << total << endl;
return 0;
}