1. 程式人生 > >藍橋杯【基礎練習】十六進位制轉十進位制、八進位制

藍橋杯【基礎練習】十六進位制轉十進位制、八進位制

十六進位制轉十進位制

問題描述

  從鍵盤輸入一個不超過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;)。嚴格遵守題目要求!!!