题目一:
问题描述
给定n个十六进制正整数,输出它们对应的八进制数。
输入格式
输入的第一行为一个正整数n (1<=n<=10)。
接下来n行,每行一个由0~9、大写字母A~F组成的字符串,表示要转换的十六进制正整数,每个十六进制数长度不超过100000。
输出格式
输出n行,每行为输入对应的八进制正整数。
【注意】
输入的十六进制数不会有前导0,比如012A。
输出的八进制数也不能有前导0。
16进制转8进制
先用1化4方法,将十六进制化为二进制;再用3并1方法,将二进制化为8制。he 代表 16进制
bin 代表 2进制
oc 代表 8进制
#include<iostream>
#include<bits/stdc++.h>
using namespace std;
string he,bi,ten;
int n;
void he_to_bin()
{
int i=0;
while(he[i])
{
switch(he[i])
{
case '0':bi+="0000";break;
case '1': bi += "0001"; break;
case '2': bi += "0010"; break;
case '3': bi += "0011"; break;
case '4': bi += "0100"; break;
case '5': bi += "0101"; break;
case '6': bi += "0110"; break;
case '7': bi += "0111"; break;
case '8': bi += "1000"; break;
case '9': bi += "1001"; break;
case 'A': bi += "1010"; break;
case 'B': bi += "1011"; break;
case 'C': bi += "1100"; break;
case 'D': bi += "1101"; break;
case 'E': bi += "1110"; break;
case 'F': bi += "1111"; break;
default:break;
}
i++;
}
}
void bin_to_ten()
{
long long int len=bi.length();
if(len%3==1)
{
bi="00"+bi;
len+=2;
}
else if(len%3==2)
{
bi="0"+bi;
len++;
}
for(long long int i=0;i<len;i+=3)
{
if (bi[i] == '0' && bi[i + 1] == '0' && bi[i + 2] == '0' && i != 0) oc += "0";
else if (bi[i] == '0' && bi[i + 1] == '0' && bi[i + 2] == '1') oc += "1";
else if (bi[i] == '0' && bi[i + 1] == '1' && bi[i + 2] == '0') oc += "2";
else if (bi[i] == '0' && bi[i + 1] == '1' && bi[i + 2] == '1') oc += "3";
else if (bi[i] == '1' && bi[i + 1] == '0' && bi[i + 2] == '0') oc += "4";
else if (bi[i] == '1' && bi[i + 1] == '0' && bi[i + 2] == '1') oc += "5";
else if (bi[i] == '1' && bi[i + 1] == '1' && bi[i + 2] == '0') oc += "6";
else if (bi[i] == '1' && bi[i + 1] == '1' && bi[i + 2] == '1') oc += "7";
}
}
int main()
{
cin>>n;
while(n--)
{
he = ""; bi = ""; ten = "";
cin>>he;
//16->2
he_to_bin();
//2->8
bin_to_ten();
cout<<ten<<endl;
}
return 0;
}
//思路是看了一个大佬的,文章找不到了,如有冒犯必删
题目二:
问题描述
从键盘输入一个不超过8位的正的十六进制数字符串,将它转换为正的十进制数后输出。
注:十六进制数中的10~15分别用大写的英文字母A、B、C、D、E、F表示。
样例输入
FFFF
样例输出
65535
这题用到了cmath中的pow函数
#include<iostream>
#include<cmath>
using namespace std;
string a;
int b[101];
long long int len,sum=0;
int i=0;
void ff()
{
while(a[i])
{
switch(a[i])
{
case '0':b[i]=0;break;
case '1':b[i]=1;break;
case '2':b[i]=2;break;
case '3':b[i]=3;break;
case '4':b[i]=4;break;
case '5':b[i]=5;break;
case '6':b[i]=6;break;
case '7':b[i]=7;break;
case '8':b[i]=8;break;
case '9':b[i]=9;break;
case 'A':b[i]=10;break;
case 'B':b[i]=11;break;
case 'C':b[i]=12;break;
case 'D':b[i]=13;break;
case 'E':b[i]=14;break;
case 'F':b[i]=15;break;
}
i++;
}
}
int main()
{
cin>>a;
len=a.length();
ff();
for(int i=0;i<len;i++)
{
sum+=b[i]*pow(16,len-1-i);
}
cout<<sum<<endl;
return 0;
}