目录
1.题目信息
时间限制:1.0s 内存限制:512.0MB
问题描述
给定n个十六进制正整数,输出它们对应的八进制数。
输入格式
输入的第一行为一个正整数n (1<=n<=10)。
接下来n行,每行一个由09、大写字母AF组成的字符串,表示要转换的十六进制正整数,每个十六进制数长度不超过100000。
输出格式
输出n行,每行为输入对应的八进制正整数。
【注意】
输入的十六进制数不会有前导0,比如012A。
输出的八进制数也不能有前导0。
样例输入
2
39
123ABC
样例输出
71
4435274
【提示】
先将十六进制数转换成某进制数,再由某进制数转换成八进制。
2.算法实现
-
数字输入改写成字符串输入利用switch语句进行16进制到2进制的转换
-
ps:为方便3位3位划分,2进制转8进制,字符串长度不是3的倍数的需要补0
-
通过algorithm库中的reverse函数翻转字符串和+=,完成补0操作,再翻转回来
-
利用switch语句和substr函数进行2进制到8进制的转换
-
去0输出,flag标志判断
3.完整代码
#include <iostream>
#include <string>
#include <algorithm>
using namespace std;
int main()
{
string s1,s2,ss;
int n;
cin>>n;
while(n--){
s1="";
s2="";
ss="";
cin>>s1;
cout<<s1<<" "<<s1.length()<<endl;
for(int i=0;i<s1.length();i++){
//switch 语句转化16进制为2进制
switch(s1[i]){
case '0':{s2+="0000";break;}
case '1':{s2+="0001";break;}
case '2':{s2+="0010";break;}
case '3':{s2+="0011";break;}
case '4':{s2+="0100";break;}
case '5':{s2+="0101";break;}
case '6':{s2+="0110";break;}
case '7':{s2+="0111";break;}
case '8':{s2+="1000";break;}
case '9':{s2+="1001";break;}
case 'A':{s2+="1010";break;}
case 'B':{s2+="1011";break;}
case 'C':{s2+="1100";break;}
case 'D':{s2+="1101";break;}
case 'E':{s2+="1110";break;}
case 'F':{s2+="1111";break;}
default:break;
}
}
cout<<s2<<" 2进制"<<endl;
//不一定是3的约数,所以要往前补0
reverse(s2.begin(),s2.end());
cout<<s2<<" 反转后"<<endl;
int num=s2.length();
if(num%3==1)s2+="00";
else if(num%3==2)s2+="0";
cout<<s2<<" 加0后"<<endl;
//反转回来
reverse(s2.begin(),s2.end());
cout<<s2<<" 再反转"<<endl;
//3位3位划分2进制转化为八进制
for(int i=0;i<s2.length();i+=3){
if(s2.substr(i,3)=="000")ss+="0";
else if(s2.substr(i,3)=="001")ss+="1";
else if(s2.substr(i,3)=="010")ss+="2";
else if(s2.substr(i,3)=="011")ss+="3";
else if(s2.substr(i,3)=="100")ss+="4";
else if(s2.substr(i,3)=="101")ss+="5";
else if(s2.substr(i,3)=="110")ss+="6";
else if(s2.substr(i,3)=="111")ss+="7";
}
cout<<ss<<" 去0前"<<endl;
//去0输入
int flag=0;
for(int i=0;i<ss.length();i++){
if(flag==0&&ss[i]=='0')continue;
cout<<ss[i];
flag=1;
}
cout<<" 去0后"<<endl;
}
return 0;
}
4.补充
16进制转10进制
- 16进制转2进制,按字符串处理,同上
- 2进制转10进制,按数处理,用pow函数
#include <iostream>
#include <string>
#include <cmath>
using namespace std;
int main()
{
string s1,s2;
s1="";
s2="";
cin>>s1;
for(int i=0;i<s1.length();i++){
//switch 语句转化16进制为2进制
switch(s1[i]){
case '0':{s2+="0000";break;}
case '1':{s2+="0001";break;}
case '2':{s2+="0010";break;}
case '3':{s2+="0011";break;}
case '4':{s2+="0100";break;}
case '5':{s2+="0101";break;}
case '6':{s2+="0110";break;}
case '7':{s2+="0111";break;}
case '8':{s2+="1000";break;}
case '9':{s2+="1001";break;}
case 'A':{s2+="1010";break;}
case 'B':{s2+="1011";break;}
case 'C':{s2+="1100";break;}
case 'D':{s2+="1101";break;}
case 'E':{s2+="1110";break;}
case 'F':{s2+="1111";break;}
default:break;
}
}
//2进制转10进制
int sum=0;
int len=s2.length();
for(int i=0;i<len;i++){
if(s2[i]=='1')sum+=pow(2,len-i-1);
}
cout<<sum;
return 0;
}