问题描述
给定n个十六进制正整数,输出它们对应的八进制数。
输入格式
输入的第一行为一个正整数n (1<=n<=10)。
接下来n行,每行一个由0~9、大写字母A~F组成的字符串,表示要转换的十六进制正整数,每个十六进制数长度不超过100000。
输出格式
输出n行,每行为输入对应的八进制正整数。
【注意】
输入的十六进制数不会有前导0,比如012A。
输出的八进制数也不能有前导0。
样例输入
2
39
123ABC
样例输出
71
4435274
【提示】
先将十六进制数转换成某进制数,再由某进制数转换成八进制。
参考代码
本人原来使用strcat函数,但时间超时,应该为strcat函数每次都遍历一次字符串找到末尾,如此累积执行付出代价巨大。后发现给定n(代码中的loc和j)变量记录偏移量,使用strncpy函数进行直接复制,strncmp函数进行比较,这样就不超时了。CPU使用时间由原来的 >1000ms 变成 15ms 。
本代码使用了几个指针操作,标注了其中的一行,其他类似。
#include<stdio.h>
#include<string.h>
#include<ctype.h>
#include<stdlib.h>
int main()
{
char str[10][100001];
char *out[10];
char *fi[10];
int N,i,j,len,loc;
scanf("%d",&N);
for(i=0;i<N;i++)
{
out[i]=(char*)calloc(400004,sizeof(char*));
out[i]+=3;
fi[i]=(char*)calloc(400004,sizeof(char*));
fi[i]+=3;
}
for(i=0;i<N;i++)
scanf("%s",str[i]);
for(i=0;i<N;i++)
{
loc=0;
len=strlen(str[i]);
for(j=0;j<len;j++)
{
switch(str[i][j])
{
case '0':
strcpy(out[i]+loc,"0000");
break;
case '1':
strcpy(out[i]+loc,"0001");
break;
case '2':
strcpy(out[i]+loc,"0010");
break;
case '3':
strcpy(out[i]+loc,"0011");
break;
case '4':
strcpy(out[i]+loc,"0100");
break;
case '5':
strcpy(out[i]+loc,"0101");
break;
case '6':
strcpy(out[i]+loc,"0110");
break;
case '7':
strcpy(out[i]+loc,"0111");
break;
case '8':
strcpy(out[i]+loc,"1000");
break;
case '9':
strcpy(out[i]+loc,"1001");
break;
case 'A':
strcpy(out[i]+loc,"1010");
break;
case 'B':
strcpy(out[i]+loc,"1011");
break;
case 'C':
strcpy(out[i]+loc,"1100");
break;
case 'D':
strcpy(out[i]+loc,"1101");
break;
case 'E':
strcpy(out[i]+loc,"1110");
break;
case 'F':
strcpy(out[i]+loc,"1111");
break;
}
loc+=4;
}
if(loc%3==1)
{
out[i]-=2;
out[i][0]=out[i][1]='0';
}
else if(loc%3==2)
{
out[i]--;
out[i][0]='0';
}
if(strncmp(out[i],"000",3)==0)
out[i]+=3; //指针前移3位,这样能让前面的000忽略掉。
loc=0;
len=strlen(out[i])/3;
for(j=0;j<len;j++)
{
if(strncmp(out[i]+loc,"000",3)==0)
strcpy(fi[i]+j,"0");
else if(strncmp(out[i]+loc,"001",3)==0)
strcpy(fi[i]+j,"1");
else if(strncmp(out[i]+loc,"010",3)==0)
strcpy(fi[i]+j,"2");
else if(strncmp(out[i]+loc,"011",3)==0)
strcpy(fi[i]+j,"3");
else if(strncmp(out[i]+loc,"100",3)==0)
strcpy(fi[i]+j,"4");
else if(strncmp(out[i]+loc,"101",3)==0)
strcpy(fi[i]+j,"5");
else if(strncmp(out[i]+loc,"110",3)==0)
strcpy(fi[i]+j,"6");
else if(strncmp(out[i]+loc,"111",3)==0)
strcpy(fi[i]+j,"7");
loc+=3;
}
}
for(i=0;i<N;i++)
printf("%s\n",fi[i]);
return 0;
}
Code language: PHP (php)
可以的这个