藍橋杯【基礎練習】十六進位制轉十進位制、八進位制
十六進位制轉十進位制
問題描述
從鍵盤輸入一個不超過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;)。嚴格遵守題目要求!!!