问题描述
给定n个十六进制正整数,输出它们对应的八进制数。
输入格式
输入的第一行为一个正整数n (1<=n<=10)。
接下来n行,每行一个由0~9、大写字母A~F组成的字符串,表示要转换的十六进制正整数,每个十六进制数长度不超过100000。
输出格式
输出n行,每行为输入对应的八进制正整数。
【注意】
输入的十六进制数不会有前导0,比如012A。
输出的八进制数也不能有前导0。
样例输入
2
39
123ABC
样例输出
71
4435274
【提示】
先将十六进制数转换成某进制数,再由某进制数转换成八进制。
解法1:
#include <stdio.h>
#include <malloc.h>
int main()
{
int n;
int *arr=(int*)malloc(sizeof(int)*n);
int num;
scanf("%d",&n);
int i=n;
while(i>0)
{
scanf("%x",&num);
arr[i]=num;
i--;
}
while(n>0)
{
printf("%o\n",arr[n]);
n--;
}
free(arr);
return 0;
}
运行结果:
可能是我想的太简单了!只用了一个不同进制数的占位符表示就写出来了!但是放在蓝桥官网的练习系统中报的是运行错误!
(我也不知道是哪里有问题o(╥﹏╥)o)
解法2(后来我又在网上搜了一种解题思路,和我的完全不一样!是更高大上的解法!)
#include <iostream>
#include <vector>
#include <string>
using namespace std;
/*
解题思路:1.用字符串接收待转换的十六进制数。用函数将其转换为二进制存储在字符串中
2.将二进制转换为八进制。其中有一个问题:一个十六进制位转换成二进制是4位,
但是一个八进制位转换二进制占3位。所以要注意位前补0的问题
3.输出的八进制数也不能有前导0,所以当第一位数为0时就不输出。
*/
string HextoBin(string Hex);
vector<int> BintoOct(string Bin);
int main()
{
int n;
cin>>n;
string *Hex=new string[n];
for(int i=0;i<n;i++)
{
cin>>Hex[i];
}
vector<int> result;
vector<int>::iterator it;
for(int i=0;i<n;i++)
{
result= BintoOct(HextoBin(Hex[i]));
for(it=result.begin();it!=result.end();it++)
{
if(it==result.begin()&&*it==0)
continue;
cout<<*it;
}
cout<<endl;
}
delete [] Hex;
return 0;
}
string HextoBin(string Hex)
{
string Bin;
for(int i=0;i<Hex.length();i++)
{
switch(Hex[i])
{
case '0' :
Bin.append("0000"); break;
case '1' :
Bin.append("0001"); break;
case '2' :
Bin.append("0010"); break;
case '3' :
Bin.append("0011"); break;
case '4' :
Bin.append("0100"); break;
case '5' :
Bin.append("0101"); break;
case '6' :
Bin.append("0110"); break;
case '7' :
Bin.append("0111"); break;
case '8' :
Bin.append("1000"); break;
case '9' :
Bin.append("1001"); break;
case 'A' :
Bin.append("1010"); break;
case 'B' :
Bin.append("1011"); break;
case 'C' :
Bin.append("1100"); break;
case 'D' :
Bin.append("1101"); break;
case 'E' :
Bin.append("1110"); break;
case 'F' :
Bin.append("1111"); break;
}
}
return Bin;
}
vector<int> BintoOct(string Bin)
{
int flog=3-Bin.length()%3;//标记补0的个数
if(flog==1)
Bin.insert(0,"0");
if(flog==2)
Bin.insert(0,"00");
int result;
int i=0;
vector<int> Otc;
while(i!=Bin.length())
{
result=4*(Bin[i++]-'0')+2*(Bin[i++]-'0')+(Bin[i++]-'0');
Otc.push_back(result);
}
return Otc;
}
运行结果与和解法一的一样。
(但是提交到蓝桥系统上依旧是有问题o(╥﹏╥)o,不过没关系,多一种思路解题,先自己敲一遍再说)