求助,这道题不能先把数字转换为十进制再进行计算吗?
查看原帖
求助,这道题不能先把数字转换为十进制再进行计算吗?
312639
RainbowBird楼主2020/9/14 23:04

求助,这道题不能先把数字转换为十进制再进行计算吗?

我的代码

#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;
}
2020/9/14 23:04
加载中...