給定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行,每行為輸入對應的八進位制正整數。注意 輸...