您的位置:首页 > 其它

蓝桥杯 十六进制转八进制

2016-01-22 23:12 162 查看
基础练习 十六进制转八进制  

时间限制:1.0s   内存限制:512.0MB
      

问题描述

  给定n个十六进制正整数,输出它们对应的八进制数。

输入格式

  输入的第一行为一个正整数n (1<=n<=10)。

  接下来n行,每行一个由0~9、大写字母A~F组成的字符串,表示要转换的十六进制正整数,每个十六进制数长度不超过100000。

输出格式

  输出n行,每行为输入对应的八进制正整数。

  【注意】

  输入的十六进制数不会有前导0,比如012A。

  输出的八进制数也不能有前导0。

样例输入

  2

  39

  123ABC

样例输出

  71

  4435274

  【提示】

  先将十六进制数转换成某进制数,再由某进制数转换成八进制。

开始用的第一种方法样例能过,但是由于数字太大,达到了超过long long能控制的范围,因此采用先化为二进制,再化为八进制的方法实现转化。

第一种方法,化为十进制法,未能AC。

#include<stdio.h>
#include<cmath>
#include<string.h>
using namespace std;
int main()
{
int n;
scanf("%d",&n);
while(n--)
{
char x[100000],ans[100000];
int p=0;
scanf("%s",x);
long long m=0;
int l=strlen(x);
for(int i=0; i<l; i++)
{
if(x[i]>='0'&&x[i]<='9')
m+=pow(16,1.0*(l-i-1))*(x[i]-'0');
else
m+=pow(16,1.0*(l-i-1))*(x[i]-'A'+10);
}
while(m>0)
{
ans[p++]=m%8+'0';
m/=8;
}
for(int i=p-1; i>=0; i--)
printf("%c",ans[i]);
printf("\n");
}
return 0;
}


第二种方法,化为二进制法,代码如下:

#include<stdio.h>
#include<string.h>
int main()
{
int n;
scanf("%d",&n);
while(n--)
{
char x[400000],a[400000],ans[1000000];
memset(x,'0',sizeof(x));
memset(a,'0',sizeof(a));
memset(ans,'0',sizeof(ans));
int q=0,p=0;
scanf("%s",x);
long long l=strlen(x);
for(int i=l-1; i>=0; i--)
{
if(x[i]=='0')
{
a[q++]='0';
a[q++]='0';
a[q++]='0';
a[q++]='0';
}
if(x[i]=='1')
{
a[q++]='1';
a[q++]='0';
a[q++]='0';
a[q++]='0';
}
if(x[i]=='2')
{
a[q++]='0';
a[q++]='1';
a[q++]='0';
a[q++]='0';
}
if(x[i]=='3')
{
a[q++]='1';
a[q++]='1';
a[q++]='0';
a[q++]='0';
}
if(x[i]=='4')
{
a[q++]='0';
a[q++]='0';
a[q++]='1';
a[q++]='0';
}
if(x[i]=='5')
{
a[q++]='1';
a[q++]='0';
a[q++]='1';
a[q++]='0';
}
if(x[i]=='6')
{
a[q++]='0';
a[q++]='1';
a[q++]='1';
a[q++]='0';
}
if(x[i]=='7')
{
a[q++]='1';
a[q++]='1';
a[q++]='1';
a[q++]='0';
}
if(x[i]=='8')
{
a[q++]='0';
a[q++]='0';
a[q++]='0';
a[q++]='1';
}
if(x[i]=='9')
{
a[q++]='1';
a[q++]='0';
a[q++]='0';
a[q++]='1';
}
if(x[i]=='A')
{
a[q++]='0';
a[q++]='1';
a[q++]='0';
a[q++]='1';
}
if(x[i]=='B')
{
a[q++]='1';
a[q++]='1';
a[q++]='0';
a[q++]='1';
}
if(x[i]=='C')
{
a[q++]='0';
a[q++]='0';
a[q++]='1';
a[q++]='1';
}
if(x[i]=='D')
{
a[q++]='1';
a[q++]='0';
a[q++]='1';
a[q++]='1';
}
if(x[i]=='E')
{
a[q++]='0';
a[q++]='1';
a[q++]='1';
a[q++]='1';
}
if(x[i]=='F')
{
a[q++]='1';
a[q++]='1';
a[q++]='1';
a[q++]='1';
}
}
for(int i=2; i<q-2; i+=3)
{
if(a[i]=='0'&&a[i-1]=='0'&&a[i-2]=='0')
ans[p++]='0';
if(a[i]=='0'&&a[i-1]=='0'&&a[i-2]=='1')
ans[p++]='1';
if(a[i]=='0'&&a[i-1]=='1'&&a[i-2]=='0')
ans[p++]='2';
if(a[i]=='0'&&a[i-1]=='1'&&a[i-2]=='1')
ans[p++]='3';
if(a[i]=='1'&&a[i-1]=='0'&&a[i-2]=='0')
ans[p++]='4';
if(a[i]=='1'&&a[i-1]=='0'&&a[i-2]=='1')
ans[p++]='5';
if(a[i]=='1'&&a[i-1]=='1'&&a[i-2]=='0')
ans[p++]='6';
if(a[i]=='1'&&a[i-1]=='1'&&a[i-2]=='1')
ans[p++]='7';
}
for(int i=p-1; i>=0; i--)
printf("%c",ans[i]);
printf("\n");
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  蓝桥杯 基础训练