十六进制转八进制
给定n个十六进制正整数,输出他们对应的八进制
输入格式
输入的第一行为一个正整数n(1 <= n <=10)
接下来n行,每行一个由0-9,A-F组成的字符串,表示要转换的十六进制正整数,每个十六进制数长度不超过100000
注:
输入的十六进制不会有前导0,输出的八进制也没有前导0
样例输入
2
39
123ABC
样例输出
71
4435274
解题思路:
1.利用工具函数转换
-
包含iomanip头文件
-
输入/输出十进制数:dec;输入/输出十六进制数:hex;输入/输出八进制数:oct。
代码实现
include<iostream> using namespace std; int main() { int n; cin>>hex>>n; cout<<oct<<n<<endl; system("pause"); return 0; }
2.十六进制转二进制转八进制
-
先将十六进制转换成二进制,再将二进制转换成八进制
-
每四位二进制数,转换为1位十六进制数;每三位二进制数转换为一位八进制数
十六进制 二进制 八进制 0 0000 0 1 0001 1 2 0010 2 3 0011 3 4 0100 4 5 0101 5 6 0110 6 7 0111 7 8 1000 20 9 1001 21 A 1010 22 B 1011 23 C 1100 24 D 1101 25 E 1110 26 F 1111 27 样例分析
39 转换为二进制 0011(这是3),1001(这是9)
二进制转八进制 000, 111( 这是7) , 001(这是1)
代码实现
#include <iostream> using namespace std; int main() { string tow; string sixteen; string eight; int n; cin>>n; for(int i=0; i<n; i++) { cin>>sixteen; //16进制转2进制 for(int j=0; j<sixteen.length(); j++) { switch(sixteen[j]) { case '0':tow+="0000";break; case '1':tow+="0001";break; case '2':tow+="0010";break; case '3':tow+="0011";break; case '4':tow+="0100";break; case '5':tow+="0101";break; case '6':tow+="0110";break; case '7':tow+="0111";break; case '8':tow+="1000";break; case '9':tow+="1001";break; case 'A':tow+="1010";break; case 'B':tow+="1011";break; case 'C':tow+="1100";break; case 'D':tow+="1101";break; case 'E':tow+="1110";break; case 'F':tow+="1111";break; } } // 不够三位用0补齐 if(tow.length()%3==1) tow="00"+tow; if(tow.length()%3==2) tow="0"+tow; //二进制转八进制 if(!(tow[0]=='0'&&tow[1]=='0'&&tow[2]=='0')) { char temp; temp = (tow[0]-'0')*4+(tow[1]-'0')*2+tow[2]; eight += temp; } for(int j=3; j<tow.length(); j+=3) { eight+=(tow[j]-'0')*4+(tow[j+1]-'0')*2+tow[j+2]; } cout<<eight<<endl; } return 0; }
代码借鉴:https://blog.csdn.net/qq_40173649/article/details/86557725
3.十六进制转十进制转八进制
-
十六进制转十进制
各位数按权展开相加。
-
十进制转八进制
整体顺序、小数点不变,整数部分除8,余数逆序排列,小数部分乘8,整数逆序排列
样例分析:
十六进制39转十进制
3 * 16^1 + 9 = 57
十进制57转八进制
整体顺序、小数点不变,整数部分除8,余数逆序排列,小数部分乘8,整数逆序排列
57/8=7…1
7/8=0…7
结果为71
代码实现
#include<iostream>
#include<cmath>
#include<cstring>
using namespace std;
//十六进制转十进制
long long hex_to_dec(string hex)
{
long long dec = 0;
int len = hex.length();
for(int i=0 ;i<len;i++)
{
//当所输入为A~F时,所输入字母减去A再加上10 便是所表示的10进制数
if(hex[i] >= 'A' && hex[i] <= 'F')
{
dec += (hex[i] - 'A' + 10) * pow(16.0,len-1-i);
}
else
{
dec += (hex[i] - '0') * pow(16.0,len-1-i);
}
}
return dec;
}
//十进制转八进制
void dec_to_oct(long long dec)
{
char a[100];
long long s = dec;
int i = 0;
while(s / 8 != 0)
{
a[i++] = '0' + s % 8; //字符串连接
s = s / 8;
}
a[i] = '0' + s;
while(i >= 0)
{
cout<<a[i--]; // 逆序输出
}
}
int main()
{
string a[10];
int n;
cin>>n;
for(int i=0;i<n;i++)
{
cin>>a[i];
}
for(int i=0;i<n;i++)
{
dec_to_oct(hex_to_dec(a[i]));
cout<<endl;
}
return 0;
}
代码借鉴:https://blog.csdn.net/qsyzb/article/details/18891219
十进制转任意进制
解题思路:
十进制正整数转换成r进制采用:除r取余法,结果为余数逆序输出。
代码实现(1) :(十进制转二进制、八进制、十六进制)
void DecToBin(int); //十进制转二进制
void DecToOct(int); //十进制转八进制
void DecToHex(int); //十进制转十六进制
int n; //输入的十进制数
int main(){
printf("Enter : ");
scanf("%d" , &n);
if (n == 0){
printf("0");
}
else
{
DecToBin(n);
DecToOct(n);
DecToHex(n);
}
return 0;
}
void DecToBin(int n){
int temp;
int a[100];
int i = 0;
while (n != 0)
{
temp = n;
n = n / 2;
a[i] = temp % 2;
i++;
}
//逆序输出余数
printf("BIN : ");
int j;
for ( j = i - 1; j >= 0; j--)
{
printf("%d",a[j]);
}
printf("\n");
}
void DecToOct(int n){
int temp;
int a[100];
int i = 0;
while (n != 0)
{
temp = n;
n = n / 8; //n此时是商
a[i] = temp % 8; //a[count]是余数
i++;
}
//逆序输出余数
printf("OCT : ");
int j;
for ( j = i - 1; j >= 0; j--)
{
printf("%d",a[j]);
}
printf("\n");
}
void DecToHex(int n){
int temp;
int a[100];
int i = 0;
while (n != 0)
{
temp = n;
n = n / 16;
a[i] = temp % 16;
i++;
}
//逆序输出余数
printf("HEX : ");
int j;
for ( j = i - 1; j >= 0; j--)
{
//余数10~15用A、B、C……表示
if (a[j] > 9 && a[j] < 16)
{
printf("%c",(a[j]-10+'A'));
}
else
printf("%d",a[j]);
}
printf("\n");
}
代码实现(2): 十进制转任意进制
int main(){
int n; //输入的十进制数
int r; //需要转换的进制数
int temp;
int a[100];
int i = 0;
printf("Enter number : ");
scanf("%d" , &n);
printf("Binary conversion : "); //输入需要转换的进制
scanf("%d" , &r);
if (n == 0){
printf("0");
}
while (n != 0)
{
temp = n;
n = n / r; //n此时是商
a[i] = temp % r; //a[count]是余数
i++;
}
//逆序输出余数
int j;
if (r == 2 || r == 8){
for ( j = i - 1; j >= 0; j--){
printf("%d",a[j]);
}
}
else{
for ( j = i - 1; j >= 0; j--){
if (a[j] > 9 && a[j] < 16)
{
printf("%c",(a[j]-10+'A'));
}
else{
printf("%d",a[j]);
}
}
}
printf("\n");
return 0;
}
任意进制转十进制
解题思路:
r进制正整数转换成十进制数:r进制数的个位乘r的0次方+十位乘r的1次方…=十进制得数,以此类推即可
代码实现 :
int ToDEC(char a[],int r); //转换为十进制
int sum=0;
int main(){
char a[100]; //需要转换的数
int r; //进制类型
printf("Enter hexadecimal type : ");
scanf("%d",&r);
printf("Enter number : ");
scanf("%s",a);
ToDEC(a,r);
printf("DEC : ");
printf("%d",sum);
return 0;
}
//转换为十进制
int ToDEC(char a[],int r){
char *p = a;
int len = strlen(p);
int temp;
while(len > 0){
if(*p >='0' && *p<='9')
{
//按权想加
temp = (*p-'0') * pow(r,len-1);
sum = sum + temp;
}
if( (*p >= 'A' && *p <= 'F') || (*p >= 'a' && *p <= 'f'))
{
//把字母转换成数字按权相加
temp = (*p-'A'+10) * pow(r,len-1);
sum = sum + temp;
}
p++;
len--;
}
return sum;
}