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号