藍橋杯「基礎練習 十六進製制轉八進位制

2021-08-21 06:06:09 字數 2150 閱讀 4565

給定n個十六進製制正整數,輸出它們對應的八進位制數。

輸入格式

輸入的第一行為乙個正整數n (1<=n<=10)。

接下來n行,每行乙個由0~9、大寫字母a~f組成的字串,表示要轉換的十六進製制正整數,每個十六進製制數長度不超過100000。

輸出格式

輸出n行,每行為輸入對應的八進位制正整數。

注意輸入的十六進製制數不會有前導0,比如012a。

輸出的八進位制數也不能有前導0。

樣例輸入 2

39123abc

樣例輸出

714435274

提示先將十六進製制數轉換成某進製數,再由某進製數轉換成八進位制。

心得:題目有些難度,一開始想的是把16進製制先轉化為10進製,因為從10進製轉化為8進製很容易。但是題目中輸入的16進製制位數規模大,不超過100000位,肯定不能化為10進製數。解法是先把16進製制化為四個2進製數,然後三個二進位制數一組再化為8進製。 注意 39(16進製制)--〉0011    1001   (2進製) --〉111  001(8進製),是從二進位制的低位開始三個一組來計算。

**:

#include

#include

#include

using

namespace

std;

intfib(int n)

//計算2的多少次方

}string str[

11];

int two[

400008];

//因為16進製制的位數不超過100000,所以換成二進位制數字數不超過400000

intmain

()

}else}}

//到目前為止把16進製制轉成了二進位制

int count=

0;//二進位制數三位一組來轉化為8進製

int sum=

0;//連續三位二進位制數的值

stack

<

int>q;

for(j=

4*str[k].length()

-1;j>=

0;--j)

//從two陣列的存數的最大下標開始處理,每三個為一組,轉化為8進製,儲存在棧中

}int sum1=

0;//考慮處理的末尾,可能最後一組少於3個,有可能是乙個,也可能是兩個,單獨處理,單獨輸出

int c=

0;for(

int m=

4*str[k].length()%

3-1;m>=

0;--m)

//4*str[k].length()%3判斷還剩下幾個

if(sum1!=

0)cout

/單獨輸出

if(q.top()==

0)q.pop();

//去除前導0,如果有的話

while(!q.empty())

cout

<<

endl;

}return

0;

}執行:

2014.3.4日修改

上面寫的**太複雜了,看到同學寫的該題,受到了啟發。十六進製制轉二進位制不用上面**那麼麻煩。

另一種解法如下:

#include

#include

using

namespace

std;

intmain

()

}int len=s2.length();

if(len%

3==1)

//三個二進位制為一位八進位制,二進位制串前面補0,確保二進位制串的長度為3的倍數

s2="00"+s2;

else

if(len%

3==2)

s2="0"+s2;

int flag=

0;for(

int i=

0;i<=s2.length()

-3;i+=

3)cout

<<

endl;

}return

0;

}

基礎練習 十六進製制轉八進

問題描述 給定n個十六進製制正整數,輸出它們對應的八進位制數。輸入格式 輸入的第一行為乙個正整數n 1 n 10 接下來n行,每行乙個由0 9 大寫字母a f組成的字串,表示要轉換的十六進製制正整數,每個十六進製制數長度不超過100000。輸出格式 輸入的十六進製制數不會有前導0,比如012a。樣例...

藍橋杯練習 基礎練習 十六進製制轉八進位制

題目鏈結 時間限制 1.0s 記憶體限制 512.0mb 問題描述 給定n個十六進製制正整數,輸出它們對應的八進位制數。輸入格式 輸入的第一行為乙個正整數n 1 n 10 接下來n行,每行乙個由09 大寫字母af組成的字串,表示要轉換的十六進製制正整數,每個十六進製制數長度不超過100000。輸出格...

藍橋杯 基礎練習 十六進製制轉八進位制

問題描述 給定n個十六進製制正整數,輸出它們對應的八進位制數。輸入格式 輸入的第一行為乙個正整數n 1 n 10 接下來n行,每行乙個由0 9 大寫字母a f組成的字串,表示要轉換的十六進製制正整數,每個十六進製制數長度不超過100000。輸出格式 輸出n行,每行為輸入對應的八進位制正整數。注意 輸...