1. 程式人生 > >藍橋杯題解-十六進位制轉八進位制-BASIC-12

藍橋杯題解-十六進位制轉八進位制-BASIC-12

原題地址:十六進位制轉八進位制

問題描述

給定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;
}

題解目錄