基础练习 十六进制转八进制
时间限制:1.0s 内存限制:512.0MB
问题描述
给定n个十六进制正整数,输出它们对应的八进制数。
输入格式
输入的第一行为一个正整数n (1<=n<=10)。
接下来n行,每行一个由0~9、大写字母A~F组成的字符串,表示要转换的十六进制正整数,每个十六进制数长度不超过100000。
输出格式
输出n行,每行为输入对应的八进制正整数。
【注意】
输入的十六进制数不会有前导0,比如012A。
输出的八进制数也不能有前导0。
样例输入
2
39
123ABC
样例输出
71
4435274
【提示】
先将十六进制数转换成某进制数,再由某进制数转换成八进制。
给定n个十六进制正整数,输出它们对应的八进制数。
输入格式
输入的第一行为一个正整数n (1<=n<=10)。
接下来n行,每行一个由0~9、大写字母A~F组成的字符串,表示要转换的十六进制正整数,每个十六进制数长度不超过100000。
输出格式
输出n行,每行为输入对应的八进制正整数。
【注意】
输入的十六进制数不会有前导0,比如012A。
输出的八进制数也不能有前导0。
样例输入
2
39
123ABC
样例输出
71
4435274
【提示】
先将十六进制数转换成某进制数,再由某进制数转换成八进制。
先将十六进制数转换成二进制数,再由二进制数转换成八进制。
我刚开始定义的char型字符数组 一直超时,看网上用的string定义的字符串就不超时,郁闷
超时代码
#include<stdio.h>
#include<string.h>
#include<string>
#include<math.h>
#include<algorithm>
#define LL long long
#define PI atan(1.0)*4
#define DD doublea
#define MAX 100100
#define mod 10007
using namespace std;
char a[MAX];
int p[MAX*10];
int main()
{
int n,m,j,i,len,sum;
scanf("%d",&n);
while(n--)
{
scanf("%s",&a);
char s[MAX*10]="";
len=strlen(a);
for(i=0;i<len;i++) //转化为二进制
{
switch(a[i])
{
case '0':strcat(s,"0000");break;
case '1':strcat(s,"0001");break;
case '2':strcat(s,"0010");break;
case '3':strcat(s,"0011");break;
case '4':strcat(s,"0100");break;
case '5':strcat(s,"0101");break;
case '6':strcat(s,"0110");break;
case '7':strcat(s,"0111");break;
case '8':strcat(s,"1000");break;
case '9':strcat(s,"1001");break;
case 'A':strcat(s,"1010");break;
case 'B':strcat(s,"1011");break;
case 'C':strcat(s,"1100");break;
case 'D':strcat(s,"1101");break;
case 'E':strcat(s,"1110");break;
case 'F':strcat(s,"1111");break;
default:break;
}
}
//puts(s);
strrev(s);
int len1=strlen(s);
if(len1%3==1) //因为二进制转八进制,是有三位二进制变为一位八进制
{ //所以要补全,在前边补0使长度能整除3
strcat(s,"00");
len1+=2;
}
else if(len1%3==2)
{
strcat(s,"0");
len1+=1;
}
int op=1;
for(i=0;i<len1-2;i+=3) //二进制转八进制
{
p[op++]=(s[i]-'0')*1+(s[i+1]-'0')*2+(s[i+2]-'0')*4;
}
int flag=1;
for(i=op;i>0;i--)
{
if(p[i]!=0)
flag=0;
if(p[i]==0&&flag)
continue;
printf("%d",p[i]);
}
printf("
");
}
return 0;
}
AC代码:
#include<stdio.h>
#include<string.h>
#include<string>
#include<math.h>
#include<algorithm>
#define LL long long
#define PI atan(1.0)*4
#define DD doublea
#define MAX 100100
#define mod 10007
using namespace std;
int p[MAX*10];
int main()
{
int n,m,j,i,len,sum;
scanf("%d",&n);
while(n--)
{
string a,s;
a.resize(MAX); //需要预先分配空间
scanf("%s",&a[0]);
s="";
len=a.length();//字符串长度
for(i=0;i<len;i++)
{
switch(a[i])
{
case '0':s+="0000";break;
case '1':s+="0001";break;
case '2':s+="0010";break;
case '3':s+="0011";break;
case '4':s+="0100";break;
case '5':s+="0101";break;
case '6':s+="0110";break;
case '7':s+="0111";break;
case '8':s+="1000";break;
case '9':s+="1001";break;
case 'A':s+="1010";break;
case 'B':s+="1011";break;
case 'C':s+="1100";break;
case 'D':s+="1101";break;
case 'E':s+="1110";break;
case 'F':s+="1111";break;
default:break;
}
}
//puts(s);
//strrev(s);
int len1=s.length();
if(len1%3==1)
{
s="00"+s; //00+s是将00加在字符串前 s+00是将00加在字符串后
len1+=2;
}
else if(len1%3==2)
{
s="0"+s;
len1+=1;
}
int op=1;
for(i=0;i<len1-2;i+=3)
{
p[op++]=(s[i]-'0')*4+(s[i+1]-'0')*2+(s[i+2]-'0')*1;
}
int flag=1;
for(i=0;i<op;i++)
{
if(p[i]!=0)
flag=0;
if(p[i]==0&&flag)
continue;
printf("%d",p[i]);
}
printf("
");
}
return 0;
}