蓝桥杯C语言 十六进制转八进制

举报
程序员飞鸟 发表于 2022/05/10 17:17:28 2022/05/10
【摘要】 十六进制转八进制思路分析:39十六进制先转换为4位二进制,3为0011,9为1001,所以39的二进制为00111001,又把二进制转化为3位八进制,从右边开始数,001为1,111为7,所以39的八进制为71。#include <stdio.h>#include <stdlib.h>#include <string.h> #define MAX_SIZE 100000/* run thi...

十六进制转八进制

在这里插入图片描述

思路分析:

39十六进制先转换为4位二进制,3为0011,9为1001,所以39的二进制为00111001,又把二进制转化为3位八进制,从右边开始数,001为1,111为7,所以39的八进制为71。

#include <stdio.h>
#include <stdlib.h>
#include <string.h> 
#define MAX_SIZE 100000
/* run this program using the console pauser or add your own getch, system("pause") or input loop */

int main(int argc, char *argv[]) {
	int n;      //十六进制数数量
	int i,j,k; // 计数变量 
	int result;
	int str_len;
	scanf("%d",&n);
	char str[n][MAX_SIZE];
	//建立数组,保存16个十六进制数对应的二进制数
	char demo[16][4] = {"0000","0001","0010","0011","0100","0101","0110","0111","1000","1001","1010","1011","1100","1101","1110","1111"};
	memset(str,0,n*MAX_SIZE);  //将str初始化为0
	for(i=0;i<n;i++){
		scanf("%s",str[i]);
		k=0;
		str_len = strlen(str[i]);   //计数十六进制数长度 
		int ss = 4*str_len%3;         //判断转换后的二进制数数量是否为的倍数,如果不是,需要补0 
		char temp[4*str_len+3-ss];
		memset(temp,0,4*str_len+3-ss);
		if(ss == 1){
			strcat(temp,"00");
			k += 2;
		}
		if(ss == 2){
			strcat(temp,"0");
			k +=1;
		}
		/* 进行十六进制向二进制数的转换  */
        for(j=0;j<str_len;j++)
        {
            if(str[i][j]<65){
                temp[k++] = demo[str[i][j]-48][0];
                temp[k++] = demo[str[i][j]-48][1];
                temp[k++] = demo[str[i][j]-48][2];
                temp[k++] = demo[str[i][j]-48][3];
            }
            else if(str[i][j]>=65){
                temp[k++] = demo[str[i][j]-55][0];
                temp[k++] = demo[str[i][j]-55][1];
                temp[k++] = demo[str[i][j]-55][2];
                temp[k++] = demo[str[i][j]-55][3];
            }
        }
        temp[k] = 0;
        //进行输出操作
		for(j=0;j<4*str_len;j+=3)
		{
			if(j==0){
                result=(4*(temp[j]-48) + 2*(temp[j+1]-48) + (temp[j+2]-48));
                if( result != 0)
                printf("%d",result);
            }
            else{
            result=(4*(temp[j]-48) + 2*(temp[j+1]-48) + (temp[j+2]-48));
            printf("%d",result);
            }
		} 
		printf("\n");

	} 
	return 0;
}
【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。