一、十六进制转十进制
二、十进制转十六进制
三、十六进制转八进制
一、十六进制转十进制
解题思路:
- 任意进制转十进制
void revd(int n,int d){
ll y = 0,p = 1;
while(n != 0){
y += (n%10) * d;
n /= 10;
p *= d;
}
cout<<y;
}
2.注意:累加要防止爆int,用long long型
3.十六进制有字母有数字,分类转换对应的数字大小
代码如下:
#include<iostream>
#include<string>
using namespace std;
#define ll long long
string s;
void revd(int d){
ll y = 0, p = 1;
for(int i = s.size() - 1; i >= 0 ; i -- ){
int t;
if(isdigit(s[i])){
t = s[i] - '0';
}else{
t = s[i] - 'A' + 10;
}
y += t * p;
p *= d;
}
cout << y;
}
int main(){
cin >> s;
revd(16);
return 0;
}
二、十进制转十六进制
解题思路:
1.十进制转换为任意进制
void revd(int n,int d){
int z[40],num = 0;
do{
z[num ++] = n%d;
n/=d;
}while(n != 0);
for(int i = num - 1; i >= 0; i -- ){
cout<<z[i];
}
}
代码如下:
#include<iostream>
#include<string>
using namespace std;
#define ll long long
char str[] = {"0123456789ABCDEF"};
int n;
string s;
void revd(int d){
int y = n;
do{
s += str[y%d];
y /= d;
}while(y != 0);
for(int i = s.size() - 1; i >= 0; i -- ){
cout<<s[i];
}
}
int main(){
cin >> n;
revd(16);
return 0;
}
三、十六进制转八进制
解题思路:
每个十六进制数长度不超过100000
- 可以推断出:并不能转换为十进制再转换为八进制
- 那么,先转换为二进制再转换为八进制,从低位到高位存储
//从低位到高位存储
int len_s = s.size() - 1;
for(int i = 0; i <= len_s; i ++ ){
a[i] = s[len_s - i];
}
- 十六转换为二进制,可以转换4位数的二进制数字
int len_b = 0,len_res = 0;
for(int i = 0; i <= len_s; i ++ ){
int t;
if(isdigit(a[i])){
t = a[i] - '0';
}else{
t = a[i] - 'A' + 10;
}
for(int j = 0; j < 4; j ++ ){
b[++len_b] = (t >> j) & 1;
}
}
- 二进制转换为八进制,小数点从左到右,每3位的和为一个数字
for(int i = 1; i <= len_b - len_c; i += 3){
int t = 0;
for(int j = 0; j < 3; j ++){
t += bits[j] * b[i + j];
}
res[++len_res] = t;
}
- 多余的部分,另外计算到前面,最后答案去掉前导0
while(res[len_res] == 0){
--len_res;
}
- 从高位到低位输出
for(int i = len_res; i >= 1; i -- ){
cout<<res[i];
}
代码如下:
#include<iostream>
#include<cstring>
using namespace std;
const int N = 1e6 + 10;
#define mm(a,x) memset(a,x,sizeof a)
char a[N];
int b[N],res[N];
int bits[] = {1,2,4};
int n;
string s;
int main(){
cin >> n;
while(n -- ){
cin >> s;
mm(a,0);mm(b,0);mm(res,0);
//从低位到高位存储
int len_s = s.size() - 1;
for(int i = 0; i <= len_s; i ++ ){
a[i] = s[len_s - i];
}
//转换为二进制
int len_b = 0,len_res = 0;
for(int i = 0; i <= len_s; i ++ ){
int t;
if(isdigit(a[i])){
t = a[i] - '0';
}else{
t = a[i] - 'A' + 10;
}
for(int j = 0; j < 4; j ++ ){
b[++len_b] = (t >> j) & 1;
}
}
int len_c = len_b%3;
for(int i = 1; i <= len_b - len_c; i += 3){
int t = 0;
for(int j = 0; j < 3; j ++){
t += bits[j] * b[i + j];
}
res[++len_res] = t;
}
if(len_c == 1){
res[++len_res] = bits[0] * b[len_b];
}else if(len_c == 2){
res[++len_res] = bits[0] * b[len_b - 1] + bits[1] * b[len_b];
}
while(res[len_res] == 0){
--len_res;
}
for(int i = len_res; i >= 1; i -- ){
cout<<res[i];
}
puts("");
}
return 0;
}