进制转换在竞赛中非常常见,我们一般都知道常见进制互相转换的方法, 但是竞赛时往往会考察一些罕见的转换, 例如九进制数转十一进制数, how to do?、
首先, 我们先了解一个api, _itoa; 它可以将一个十进制数转换为任意进制
char str[100];
_itoa(sum, str, mbjz);
cout << str;
sum, 是一个十进制数, mbjz是目标进制, str是sum转换为目标进制之后的数, 注意: 必须是char str[] 必须是字符数组, 不能是字符串, 疯狂报错,
ok, 说到这里大家大概也能明白如何进制转换了, 就是先将一个n进制数转换为十进制数, 再将十进制数转换为目标进制数,上代码;
#include <bits/stdc++.h>
using namespace std;
typedef long long LL;
int main (){
int num, i = 1, sum = 0, numjz, mbjinzhi;
cin >> num >> numjz >> mbjinzhi;
while (num){
int temp = num % 10;
sum += temp * i;
num /= 10;
i = i * numjz;
}
cout << "10进制 = " << sum << endl;
char str[100];
_itoa (sum, str, mbjinzhi);
cout << str;
return 0;
}
如果我们想将str转为int型可以用atoi(str);
但是atoi只能处理int范围的数2, 如果str代表的整型数过大就不可以用, 所以得写一个通解
#include <bits/stdc++.h>
using namespace std;
typedef long long LL;
int main (){
LL num, numjz, mbjz;
cin >> num >> numjz >> mbjz;
LL i = 1;
LL ans = 0;
while (num){
int temp = num % 10;
ans += temp * i;
i = i * numjz;
num /= 10;
cout << "num = " << num << " ans = " << ans << endl;
}
stack<int>N;
while (ans){
N.push(ans % mbjz);
ans = ans / mbjz;
}
char s[100] = {'0'};
int m = 0;
while (!N.empty()){
int t = N.top();
N.pop();
if (t >= 10) {
s[m ++] = t - 10 + 'A';
}
else {
s[m ++] = t + '0';
}
}
m --;
for (int i = 0; i <= m; i ++){
cout << s[i];
}
cout << endl;
return 0;
}
利用栈来存储,逆序输出,单独处理t >= 10的情况;