問題描述
給定n個十六進製制正整數,輸出它們對應的八進位制數。
輸入格式
輸入的第一行為乙個正整數n (1<=n<=10)。
接下來n行,每行乙個由0~9、大寫字母a~f組成的字串,表示要轉換的十六進製制正整數,每個十六進製制數長度不超過100000。
輸出格式
輸出n行,每行為輸入對應的八進位制正整數。
注意輸入的十六進製制數不會有前導0,比如012a。
輸出的八進位制數也不能有前導0。
樣例輸入239
123abc
樣例輸出
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;int fib(int n)//計算2的多少次方
}string str[11];
int two[400008];//因為16進製制的位數不超過100000,所以換成二進位制數字數不超過400000
int main()
}else
}}//到目前為止把16進製制轉成了二進位制
int count=0;//二進位制數三位一組來轉化為8進製
int sum=0;//連續三位二進位制數的值
stackq;
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<
2014.3.4日修改
上面寫的**太複雜了,看到同學寫的該題,受到了啟發。十六進製制轉二進位制不用上面**那麼麻煩。
另一種解法如下:
#include #include using namespace std;
int main()
{ int n;
cin>>n;
for(int k=1;k<=n;k++)
{string s1,s2;//s1為輸入的原始的十六進製制串,s2為轉化成的二進位制串
cin>>s1;
s2="";//初始化
for(int i=0;i
基礎練習 十六進製制轉八進
問題描述 給定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行,每行為輸入對應的八進位制正整數。注意 輸...