藍橋杯題解-十六進位制轉八進位制-BASIC-12
阿新 • • 發佈:2019-01-14
原題地址:十六進位制轉八進位制
問題描述
給定n個十六進位制正整數,輸出它們對應的八進位制數。
輸入格式
輸入的第一行為一個正整數n (1<=n<=10)。
接下來n行,每行一個由09、大寫字母AF組成的字串,表示要轉換的十六進位制正整數,每個十六進位制數長度不超過100000。
輸出格式
輸出n行,每行為輸入對應的八進位制正整數。
【注意】
輸入的十六進位制數不會有前導0,比如012A。
輸出的八進位制數也不能有前導0。
樣例輸入
2
39
123ABC
樣例輸出
71
4435274
【提示】
先將十六進位制數轉換成某進位制數,再由某進位制數轉換成八進位制
解1:
1.十六進位制先轉十進位制(參考BASIC-10-十六進位制轉十進位制),然後再除八取餘。
QAQ怎麼會有問題,我自己測試完美啊。
我點選了第二個錦囊,提示我先轉為二進位制。而且我看了些其他人的解,決定先擱置十進位制為中間進位制的方法,轉為用二進位制。
程式碼暫時先貼這裡。
程式碼1:
#include"iostream"
#include"string"
#include"cmath"
using namespace std;
void changeto8(int a)
{
int p;//p儲存除16取餘的值
p=a%8;//先取餘
a/=8;//再/=
if(a> 0)
changeto8(a);//然後遞迴
cout<<p;
}
int main()
{
int n;//轉換個數
string s[10];//儲存十六進位制數
int a[10]={0};//儲存十進位制
cin>>n;
fflush(stdin);
for(int i=0;i<n;i++)
getline(cin,s[i]);
for(int num=0;num<n;num++)//計算十進位制
for(int i=(s[num].length()-1),j=0;i>=0;j++,i--)
{
if(int(s[num][i])>= 65)
a[num]+=(int(s[num][i])-55)*pow(16.0,j);
else
a[num]+=(int(s[num][i])-48)*pow(16.0,j);
}
for(int num=0;num<n;num++)//算八進位制
{
changeto8(a[num]);
cout<<endl;
}
return 0;
}
解2:
二進位制轉八進位制尚未完成。
程式碼2:
#include"iostream"
#include"string"
#include"cmath"
using namespace std;
int main()
{
int n;//轉換個數
string s[10];//儲存十六進位制數
string ba;//儲存當前八進位制數
string a[10];//儲存二進位制
cin>>n;
fflush(stdin);//清空鍵盤快取
for(int i=0;i<n;i++)
getline(cin,s[i]);
for(int num=0;num<n;num++)//遍歷n個數,從下標為0的開始
{
for(int i=0;i<s[num].length();i++)//從最高位開始計算二進位制
{
if(int(s[num][i])>=65)
{
for(int shi=int(s[num][i])-55,j=3;j>=0;j--)
{
if(shi/int(pow(2.0,j)))a[num].push_back('1');
else a[num].push_back('0');
shi%=int(pow(2.0,j));
}
}
else
{
for(int shi=int(s[num][i]-48),j=3;j>=0;j--)
{
if(shi/int(pow(2.0,j)))a[num].push_back('1');
else a[num].push_back('0');
shi%=int(pow(2.0,j));
}
}
}
//cout<<a[num]<<endl;//二進位制輸出來看看,前面會有0
}
/*
int e=0;//放每三位轉換八進位制後的數
for(int num=0;num<n;num++)//八進位制轉換並輸出
{
for(int l=a[num].length()-1,e=0;l%3>=0&&l>0;e=0,l-=3)
{
if(l%3==0)//三位
{
e+=pow(2.0,2)*a[num][l-2];
e+=pow(2.0,1)*a[num][l-1];
e+=a[num][l];
ba.push_back(e);
cout<<"3."<<e<<" ";//
}
else if(l%3==2)//兩位
{
e+=pow(2.0,1)*a[num][l-1];
e+=a[num][l];
ba.push_back(e);
cout<<"2."<<e<<" ";//
}
else if(l%3==1)//一位
{
e+=a[num][l];
ba.push_back(e);
cout<<"3."<<e<<" ";//
}
}
/*for(int l=ba.length()-1;l>=0;l--)//輸出
{
cout<<ba[l];
}*/
cout<<endl;//輸出每個八進位制後換行
ba.clear();//輸出完要清空,只申請了一個空間給八進位制,而且新增用的是pushback
e=0;//e也要清空
}
*/
return 0;
}