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

                                                              十进制转十六进制
问题描述
  十六进制数是在程序设计时经常要使用到的一种整数的表示方式。它有0,1,2,3,4,5,6,7,8,9,A,B,C,D,E,F共16个符号,分别表示十进制数的0至15。十六进制的计数方法是满16进1,所以十进制数16在十六进制中是10,而十进制的17在十六进制中是11,以此类推,十进制的30在十六进制中是1E。
  给出一个非负整数,将它表示成十六进制的形式。
输入格式
  输入包含一个非负整数a,表示要转换的数。0<=a<=2147483647
输出格式
  输出这个整数的16进制表示
样例输入
30
样例输出
1E

思路:将十进制->二进制->十六进制
入坑:1.转换为二进制后每四位每四位进行转换成十六进制,当剩下的不足四位时,应当跳出,再对剩余的3 2 1 进行讨论
#include<iostream>
#include<cstring>
#include<string>
#include<cmath>
#include<algorithm>
using namespace std;
const int Max=500005;
int arr[Max];
char str[55], str1[505],str2[505];
string getBin(int num){//低->高 
    string str="";
	while(num){
	 if(num%2){
	 	str+='1';
	 }else{
	 	str+='0';
	 }	
    num/=2;
    } 
    return str;
}
int main()
{
  int i;
  unsigned long long num;
  cin>>num;
  //get 二进制; 
  string s=getBin(num); 
  int len=s.length();
  int len1=0;
//  cout<<s<<endl;
 // cout<<"len:"<<len<<endl;
  for(i=0;i<len;i=i+4){
  	if((i+3)<=len-1){
  	if(s[i]=='0'&&s[i+1]=='0'&&s[i+2]=='0'&&s[i+3]=='0'){
  	 str1[len1++]='0';	
	}else if(s[i]=='1'&&s[i+1]=='0'&&s[i+2]=='0'&&s[i+3]=='0'){
	 str1[len1++]='1';
	}else if(s[i]=='0'&&s[i+1]=='1'&&s[i+2]=='0'&&s[i+3]=='0'){
	 str1[len1++]='2';
	}else if(s[i]=='1'&&s[i+1]=='1'&&s[i+2]=='0'&&s[i+3]=='0'){
	 str1[len1++]='3';
	}else if(s[i]=='0'&&s[i+1]=='0'&&s[i+2]=='1'&&s[i+3]=='0'){
	 str1[len1++]='4';
	}else if(s[i]=='1'&&s[i+1]=='0'&&s[i+2]=='1'&&s[i+3]=='0'){
	 str1[len1++]='5';
	}else if(s[i]=='0'&&s[i+1]=='1'&&s[i+2]=='1'&&s[i+3]=='0'){
	 str1[len1++]='6';
	}else if(s[i]=='1'&&s[i+1]=='1'&&s[i+2]=='1'&&s[i+3]=='0'){
	 str1[len1++]='7';
	}else if(s[i]=='0'&&s[i+1]=='0'&&s[i+2]=='0'&&s[i+3]=='1'){
	 str1[len1++]='8';
	}else if(s[i]=='1'&&s[i+1]=='0'&&s[i+2]=='0'&&s[i+3]=='1'){
	 str1[len1++]='9';
	}else if(s[i]=='0'&&s[i+1]=='1'&&s[i+2]=='0'&&s[i+3]=='1'){
	 str1[len1++]='A';
	}else if(s[i]=='1'&&s[i+1]=='1'&&s[i+2]=='0'&&s[i+3]=='1'){
	 str1[len1++]='B';
	}else if(s[i]=='0'&&s[i+1]=='0'&&s[i+2]=='1'&&s[i+3]=='1'){
	 str1[len1++]='C';
	}else if(s[i]=='1'&&s[i+1]=='0'&&s[i+2]=='1'&&s[i+3]=='1'){
	 str1[len1++]='D';
	}else if(s[i]=='0'&&s[i+1]=='1'&&s[i+2]=='1'&&s[i+3]=='1'){
	 str1[len1++]='E';
	}else if(s[i]=='1'&&s[i+1]=='1'&&s[i+2]=='1'&&s[i+3]=='1'){
	 str1[len1++]='F';
	}
	}
	else 
	break;
  } 
 // cout<<"i:"<<i<<endl; 
  i=len-i;//i of the result express the number for left thing. 
//  cout<<"i:"<<i<<endl;
 // cout<<i<<endl; 
  if(i==3){
  	if(s[len-3]=='0'&&s[len-2]=='0'&&s[len-1]=='0'){
  		str1[len1++]='0';
	}else if(s[len-3]=='1'&&s[len-2]=='0'&&s[len-1]=='0'){
  		str1[len1++]='1';
	}else if(s[len-3]=='0'&&s[len-2]=='1'&&s[len-1]=='0'){
  		str1[len1++]='2';
	}else if(s[len-3]=='1'&&s[len-2]=='1'&&s[len-1]=='0'){
  		str1[len1++]='3';
	}else if(s[len-3]=='0'&&s[len-2]=='0'&&s[len-1]=='1'){
  		str1[len1++]='4';
	}else if(s[len-3]=='1'&&s[len-2]=='0'&&s[len-1]=='1'){
  		str1[len1++]='5';
	}else if(s[len-3]=='0'&&s[len-2]=='1'&&s[len-1]=='1'){
  		str1[len1++]='6';
	}else if(s[len-3]=='1'&&s[len-2]=='1'&&s[len-1]=='1'){
  		str1[len1++]='7';
	}
  }else if(i==2){
  	if(s[len-2]=='0'&&s[len-1]=='0'){
  	    str1[len1++]='0';	
	}else if(s[len-2]=='1'&&s[len-1]=='0'){
		str1[len1++]='1';
	}else if(s[len-2]=='0'&&s[len-1]=='1'){
		str1[len1++]='2';
	}else if(s[len-2]=='1'&&s[len-1]=='1'){
		str1[len1++]='3';
	}
  }else if(i==1){
  	if(s[len-1]=='0')
  	str1[len1++]='0';
	else if(s[len-1]=='1')
	str1[len1++]='1'; 
  }
 // cout<<str1<<endl;
 // if(i<5;)
  int flag=0;
  unsigned long long sum=0;
  for(int i=len1-1;i>=0;i--){
  	flag=1;
  	cout<<str1[i];
  } 
  if(flag==0){
  	cout<<'0'; 
  }
  cout<<endl;
  return 0;	

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值