SP870 题解
思路
进制转换题。主要分为两种情况:
- $n$ 进制转 $10$ 进制。
- $10$ 进制转 $n$ 进制。
对于第一种情况,我们可以考虑对数进行按位权展开。举几个例子:$$ 114514_{(8)}=1\times8^5+1\times8^4+4\times8^3+5\times8^2+1\times8^1+4\times8^0 \\ 191810_{(16)}=1\times16^6+9\times16^5+1\times16^4+9\times16^3+8\times16^2+1\times16^1+0\times16^0 \\ $$
        for(int i = s.size() - 1 ; i >= 0 ; i --){
            if(s[i] >= '0' && s[i] <= '9')sum += (s[i] - '0') * pow(cnt, pos); 
            else sum += (s[i] - 55) * pow(cnt, pos);
            pos++;
        }对于第二种情况,考虑采用短除法,除以进制数逆序取余。
        while(sum > 0){
            pos++;f[pos] = sum % tmp;sum /= tmp;
        }代码
#include <iostream>
#include <cstring>
#include <cmath>
#define int long long
using namespace std;
string s;
int cnt, tmp, sum, pos, f[1005];
signed main(){
    ios::sync_with_stdio(0);
    cin.tie(0);cout.tie(0);
    while(cin >> s >> cnt >> tmp){
        memset(f, 0, sizeof(f));
        pos = 0;sum = 0;
        for(int i = s.size() - 1 ; i >= 0 ; i --){
            if(s[i] >= '0' && s[i] <= '9')sum += (s[i] - '0') * pow(cnt, pos); 
            else sum += (s[i] - 55) * pow(cnt, pos);
            pos++;
        }
        pos = 0;
        while(sum > 0){
            pos++;f[pos] = sum % tmp;sum /= tmp;
        }
        if(pos > 7)cout << "ERROR" << endl;
        else{
            for(int i = 1 ; i <= 7 - pos ; i ++)cout << ' ';
            for(int i = pos ; i >= 1 ;  i --){
                if(f[i] >= 10)cout << char(f[i] + 55);
                else cout << f[i];
            } 
            cout << endl;
        }
    }
    return 0;
}
 
                
            
         
         浙公网安备 33010602011771号
浙公网安备 33010602011771号