1. 程式人生 > 其它 >樹上啟發式合併: 清明是春天的節日, 所以可以叫《春節》

樹上啟發式合併: 清明是春天的節日, 所以可以叫《春節》

十六進位制轉八進位制

心得

看到題目,我想到的是。。。這。。。
然後我仔細想了想,我的確不會進位制的轉換,別說轉換,就連是什麼都不是特別瞭解
然後就花了一些時間去學,別說,度娘是真的香
總之,我jio得,這題比之前的題難了不止一個度。。。
然後理解了,但不是很會用,就去百度了,我jio得這位博主已經寫的很完善了,再改也沒什麼意思了
點選跳轉博主頁面
還是把我理解的程式碼也放過來吧

難點

進位制之間的轉換還有進位制的一些注意事項等
十六進位制轉換成二進位制到不是很難理解,畢竟有點離散的知識
但是二進位制轉換成八進位制就有一點點小坑,具體的。。。
看看度娘解釋
點選跳轉度娘解釋

目前java還不是很會用,太醜了,也還有很多沒改好,等補好再評論區見

#include <iostream>
#include <string>
using namespace std;
void main()
{
	string s1,s2;
	int n;
	int i,j,k;
	cin>>n;
	for(i=0;i<n;i++)
	{
		cin>>s1;
		s2="";
		for(j=0;j<s1.length();j++)//用s1.length記住輸入的資料的個數,然後再用下標查詢法把十六進位制的數轉化成二進位制
		{
			switch(s1[j])
			{
			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;
			}
		}
		if(s2.length()%3==1)//用s2.length記住轉化成二進位制之後的數,在把s2轉化成八進位制,再輸出,用取三合一法
			s2="00"+s2;
		if(s2.length()%3==2)
			s2="0"+s2;
		int flag=0;
		for(k=0;k<s2.length()-2;k+=3)
		{
			int p=4*(s2[k]-'0')+2*(s2[k+1]-'0')+s2[k+2]-'0';//這個我理解為一個公式之類的,因為看的真的不是很懂
			if(p)
				flag=1;
			if(flag)
				cout<<p;
		} 
		cout<<endl;
	} 
	return ;
}