藍橋杯備賽第二天

2021-09-10 14:13:45 字數 2062 閱讀 7523

第二天

問題描述

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

輸入格式

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

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

輸出格式

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

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

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

樣例輸入

123abc

樣例輸出

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

分析:首先想到的就是將十六進製制的每位數轉換為四位二進位制數 然後每三位二進位制數轉換為八進位制數

減少在運算上的計算運用的hashmap來訪問每一位數對應的值。

但是發現無法設定map

實在想不出來

網上的方法(看似簡單的數制轉換,也用到了棧)

public class transform{

public void systemscanner() {

scanner jin = new scanner(system.in);

while (jin.hasnext()) {

int length = jin.nextint();

for (int i = 0; i < length; i++){

string strtmp=jin.next();

tranform(strtmp.tochararray(), strtmp.length());

public static void main(string args) {

new transform().systemscanner();

* 3位16進製制等價於4位8進製

int stack=new int[40000];//根據測試資料進行的設定

public void tranform(char str, int length) {

char buff = new char[4];//這個好像是多餘的,後面也沒有用到buff

int top = -1;

for (int i = length - 1; i >= 0; i -= 3) {

int sum = 0;

for (int j = 0; j < 3 && i - j >= 0; j++) {// i-j>=0防止不夠三個的情況

int tmp =( str[i - j] >= '0' && str[i - j] <= '9' )? str[i - j] - '0': str[i - j] - 'a' + 10;//區分是數字,還是字元,進行對應轉換

sum+=(tmp<<(4*j));//這句很重要,通過這句就可以從16變成10進製了,不過,不知道為什麼?是如何得出的呢?而且進行累加之後就能得到最終的結果很神奇(其實是進行左移位,左移四位就相當於乘了16,8位就是256 16的平方)

stack[++top]=sum;//sum的結果是16進製制轉化10進製的結果,每3個16進製制變成10進製,再變8進製(每三位十六進製制轉換為十進位制)

while(stack[top]==0){//排除前導為0的判斷

top--;

// for(int i=top;i>=0;i--){//直接輸出會丟失前導0,因為此轉化成8進製並不是最左邊的情況,應該保留0

// system.out.print(integer.tooctalstring(stack[i]));//從10進製轉化成8進製

for(int i=top;i>=0;i--){

string str1=integer.tooctalstring(stack[i]);//從10進製轉化成8進製

if(i!=top&&str1.length()<4){

//不是最左邊的乙個,就不用去掉前導0,而預設是去掉0的,所以要進行補會

for(int y=0;y<4-str1.length();y++)

system.out.print("0");

system.out.print(str1);

system.out.println();

藍橋杯訓練 第二天1261

藍橋杯2015初賽 移動距離 x星球居民小區的樓房全是一樣的,並且按矩陣樣式排列。其樓房的編號為1,2,3.當排滿一行時,從下一行相鄰的樓往反方向排號。比如 當小區排號寬度為6時,開始情形如下 1 2 3 4 5 6 12 11 10 9 8 7 13 14 15 我們的問題是 已知了兩個樓號m和n...

藍橋杯訓練 第二天1259 1260

藍橋杯2015初賽 三羊獻瑞 觀察下面的加法算式 其中,相同的漢字代表相同的數字,不同的漢字代表不同的數字。請你填寫 三羊獻瑞 所代表的4位數字 答案唯一 不要填寫任何多餘內容。輸出請你填寫 三羊獻瑞 所代表的4位數字 答案唯一 不要填寫任何多餘內容。答案唯一,相同的漢字代表相同的數字,不同的漢字代...

藍橋杯訓練 第二天1255 1258

藍橋杯2015初賽 飲料換購 樂羊羊飲料廠正在舉辦一次 優惠活動。樂羊羊c型飲料,憑3個瓶蓋可以再換一瓶c型飲料,並且可以一直迴圈下去 但不允許暫借或賒賬 請你計算一下,如果小明不浪費瓶蓋,盡量地參加活動。那麼,對於他初始 的n瓶飲料,最後他一共能喝到多少瓶飲料。輸入輸入存在多組測試資料 每組測試資...