十六进制转八进制

问题描述
  给定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)

《十六进制转八进制》有1条留言

留下评论