Stay determined.

蓝桥杯基础练习 BASIC-12.十六进制转八进制

Posted on By Yang Guang
Viewed   times

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

输入格式   输入的第一行为一个正整数n (1<=n<=10)。   接下来n行,每行一个由0~9、大写字母A~F组成的字符串,表示要转换的十六进制正整数,每个十六进制数长度不超过100000。

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

  【注意】   输入的十六进制数不会有前导0,比如012A。   输出的八进制数也不能有前导0。

样例输入   2   39   123ABC

样例输出   71   4435274

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

一次学会就行。

#include<stdio.h>
#include<string.h>

	char h[100002],b[400002],e[400002];
	int main(){
		int n;
		scanf("%d",&n);
		while(n--){
			scanf("%s",h);
			int i,len=0;
			for(i=strlen(h)-1;i>=0;i--){
				int v,j;
				if(h[i]>='0' && h[i]<='9')
					v=h[i]-'0';
				else v=h[i]-'A'+10;
				for(j=0;j<4;j++){
					b[len++]=v%2+'0';
					v/=2;
				}
			}
			b[len]='\0';
			int x=0,cnt=1;
			int l=0;
			for(i=0;i<len;i++){
				if(cnt==4||i==len-1){
					x=cnt*(b[i]-'0')+x;
					cnt=1;
					e[l++]=x+'0';
					x=0;
				} else{
					x=cnt*(b[i]-'0')+x;
					cnt*=2;
				   }
			}
			i=l-1;
			while(i>=0 && e[i]=='0')
				i--;
			if(i<0)
				printf("0");
			for (;i>=0;i--){
				printf("%c",e[i]);
			}
			printf("\n");
		}
		return 0;
	}



================================================================================================