您的位置:首页 > 其它

蓝桥杯-十六进制转八进制

2016-03-07 09:05 239 查看
基础练习 十六进制转八进制

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

问题描述

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

输入格式

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

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

输出格式

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

  【注意】

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

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

样例输入

  2

  39

  123ABC

样例输出

  71

  4435274

  【提示】

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

#include<cstdio>
#include<iostream>
#include<cstring>
#include<cmath>
using namespace std;
char s1[990000], s2[990000], s3[990000], s4[990000];
string getT(char c) {
	string s;
	switch(c) {
		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;
	}
	return s;
}
char getE(char *a) {
	char s;
	if (a[0] == '0' && a[1] == '0' && a[2] == '0') s = '0';
	else if (a[0] == '0' && a[1] == '0' && a[2] == '1') s = '1';
	else if (a[0] == '0' && a[1] == '1' && a[2] == '0') s = '2';
	else if (a[0] == '0' && a[1] == '1' && a[2] == '1') s = '3';
	else if (a[0] == '1' && a[1] == '0' && a[2] == '0') s = '4';
	else if (a[0] == '1' && a[1] == '0' && a[2] == '1') s = '5';
	else if (a[0] == '1' && a[1] == '1' && a[2] == '0') s = '6';
	else if (a[0] == '1' && a[1] == '1' && a[2] == '1') s = '7';	
	return s;
}
int getTwo(char *s1) {
	char ss[5];
	int k = 2;
	int len = strlen(s1);
	for (int i = 0; i < len; i++) {
		string n1 = getT(s1[i]);
		for (int j = k, x = 0; x < 4; j++,x++) {
				s2[j] = n1[x];
		}
		k += 4;
	}
	return k;
}
int main() {
	int n, len3, len4;
	scanf("%d", &n);
	while(n--) {
		scanf("%s", s1);
		len3 = 2, len4 = 0;
		int len5 = 0;
		int len = getTwo(s1);
		int index = 0;
		for (int i = 2; i < len; i++) {
			if (s2[i] != '0') {
				index = i;
				break;
			}
		}
		for (int i = index; i < len; i++) {
			len5++;
			s3[len3++] = s2[i];
		}
		int m = len5%3;
		int index1 = 3-m;
		if (index1 == 2) {
			s3[0] = '0';s3[1] = '0';
			index = 0;
		} else if (index1 == 1) {
			s3[1] = '0';
			index = 1;
		} else {
			index = 2;
		}
		for (int i = index; i < len3;) {
			char ss[3];
			ss[0] = s3[i];ss[1] = s3[i+1];ss[2] = s3[i+2];
			s3[len4++] = getE(ss);
			i += 3;
		}
		for (int i = 0; i < len4; i++) printf("%c", s3[i]);
		puts("");
	}
	
	return 0;
}


第二种解法:

#include<cstdio>
#include<math.h>
#include<cstring>
int temp[410000];
char jz16[110000];
int answer[410000];
int switcha(char a)
{
	if(a>='0'&&a<='9')
	    return a-'0';
	else
	    return a-'A'+10;
}
int main()
{
	int n;
	int len;
	int now;
	int i,j,k;
	int sum;
	scanf("%d",&n);
	while(n--)
	{
		scanf("%s",jz16);
		len=strlen(jz16);
		for(i=0;i<len;i++)
		{
			now=switcha(jz16[i]);
			for(j=(i+1)*4-1;j>=i*4;j--)
			{
				temp[j]=now%2;
				now/=2;
			}
		}//一个十六进制变成4个二进制顺着来 
		memset(answer,0,sizeof(answer));
		for(i=len*4-1,sum=0;i>=0;i-=3,sum++)
		//三个二进制变成一个八进制逆着来 
		    for(j=i,k=0;j>i-3&&j>=0;j--,k++)
		        answer[sum]+=temp[j]*(int)pow(2,k);
		for(i=sum;;i--)
		    if(answer[i]!=0)
		        break;
		//注意不输出前面多余的0 
		for(i=i;i>=0;i--)
		    printf("%d",answer[i]);
		printf("\n");
	}
	return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: