蓝桥杯【基础练习】十六进制转十进制、八进制

十六进制转十进制

问题描述

  从键盘输入一个不超过8位的正的十六进制数字符串,将它转换为正的十进制数后输出。
  注:十六进制数中的10~15分别用大写的英文字母A、B、C、D、E、F表示。

样例输入

FFFF

样例输出

65535

方法一:巧用C语言的输入输出格式符

#include"cstdio"
int main(){
	__int64 n;	//等价于 long long int n; 
    //unsigned int n;
	scanf("%llx",&n);	//注意格式符 
	printf("%lld\n",n);	//llu==lld 
	return 0;
} 

注意:

试了好多次,每次运行FFFFFFFF的时候都会溢出,后来无意中看到无符号整数(unsigned int,例如-1的无符号数(32位)应该位4294967295),运行结果正确。或者长整型(long long,不同的编译环境可能位数不同,通常为32位或64位)。

方法二:

#include"iostream"
#include"string"
using namespace std;
int main(){
	string s;
	cin>>s;
	unsigned int t=0,n=1;//FFFFFFFF H=4294967295 D 
	int i=s.size()-1;
	for(;i>=0;i--){
		if(s[i]<='9')
			t+=(s[i]-'0')*n;
		else
			t+=(s[i]-'A'+10)*n;
		//cout<<t<<" ";
		n*=16;
	}
	//cout<<endl;
	cout<<t<<endl;
	return 0;
} 

十六进制转八进制

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

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

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

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

样例输入
  2
  39
  123ABC

样例输出
  71
  4435274

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

方法一:巧用C语言的输入输出格式符

#include"cstdio"
int n;    //试了很多次,想不通为什么n要声明为全局变量
int main(){
	//int n;    在main内声明n时,循环不按照题目要求结束
	scanf("%d",&n);	
	unsigned int t;
	while(n!=0){		
		scanf("%llx",&t);
		printf("%llo\n",t);
		n--;				
	}
	return 0;
}

方法二:借鉴(哈哈 一个好的程序猿是“搬运工”)

#include"iostream"
#include"string"
using namespace std;
int main(){
	int n;
	cin>>n;
	string s1,s2;
	while((n--)!=0){
		cin>>s1;
		s2="";
		for(int i=0;i<s1.size();i++){
			switch(s1[i]){
				case '0':s2+="0000";break;
				case '1':s2+="0001";break;
				case '2':s2+="0010";break;
				case '3':s2+="0011";break;
				case '4':s2+="0100";break;
				case '5':s2+="0101";break;
				case '6':s2+="0110";break;
				case '7':s2+="0111";break;
				case '8':s2+="1000";break;
				case '9':s2+="1001";break;
				case 'A':s2+="1010";break;
				case 'B':s2+="1011";break;
				case 'C':s2+="1100";break;
				case 'D':s2+="1101";break;
				case 'E':s2+="1110";break;
				case 'F':s2+="1111";break;
				default :break;
			}
		}
		int len=s2.size();
		if(len%3==1)
			s2="00"+s2;
		if(len%3==2)
			s2="0"+s2;
		int flag=0;
		for(int i=0;i<=s2.size()-3;i+=3){
			int num=(s2[i]-'0')*4+(s2[i+1]-'0')*2+(s2[i+2]-'0');
			if(num)		//忽略前导0 
				flag=1;
			if(flag)
				cout<<num;
		}
		cout<<endl;
	} 
	return 0;
}

小结:

十六进制转八进制的时候,提示“先将十六进制数转换成某进制数,再由某进制数转换成八进制。”但是因为题目要求十六进制数的长度不超过100000,如果用十进制做中间值会溢出,故我们采用二进制,我们可以利用C++的string类,要注意四位二进制表示一位十六进制,三位二进制表示一位八进制,故由二进制转八进制时要注意和3qu取余,修改二进制的长度

(if(len%3==1)  s2=”00″+s2; if(len%3==2)s2=”0″+s2;)。严格遵守题目要求!!!

    原文作者:进制转换
    原文地址: https://blog.csdn.net/zdm_0301/article/details/84866901
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞