藍橋杯——Java基礎(進位制)

weixin_34019929發表於2017-12-11

本文屬xxKarina原創,轉載請註明
個人部落格地址:
https://xxkarina.github.io/

在前面的一篇Java基礎部落格中,不少人蠻喜歡的,這讓我備受鼓舞,決定再出藍橋——Java基礎(續)^-^

1.數列排序

問題描述

給定一個長度為n的數列,將這個數列按從小到大的順序排列。1<=n<=200

輸入格式

第一行為一個整數n。
第二行包含n個整數,為待排序的數,每個整數的絕對值小於10000。

輸出格式

輸出一行,按從小到大的順序輸出排序後的數列。

對於簡單的數列排序,我們可以選中使用陣列進行儲存,因為陣列有個好處就是,排序方便sort()

上面的題目要求是使用者輸入的數字為1<=n<=200但是由於藍橋杯的輸入都是基於正確的輸入的前提下,所以我們可以不對這部分做處理,於是整個題目就可以簡化為:獲取使用者輸入的數,並按從小到大的順序輸出

原始碼如下(通過測試)

import java.util.Arrays;
import java.util.Scanner;

public class Main {
    public static void main(String args[]){
        Scanner scanner = new Scanner(System.in); 
        int n = scanner.nextInt();
        int[] arr = new int[n];
        for (int i = 0; i < n; i++) {
            arr[i] = scanner.nextInt();
        }
        Arrays.sort(arr);
        for (int i:arr) {
            System.out.print(i+" ");
        }
    }
}

2.十六進位制轉八進位制

問題描述

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

輸入格式

輸入的第一行為一個正整數n (1<=n<=10)。
  接下來n行,每行一個由09、大寫字母AF組成的字串,表示要轉換的十六進位制正整數,每個十六進位制數長度不超過100000。

輸出格式

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

這種題目有幾種思路
1.將十六進位制數轉為2進位制之後再轉化為8進位制
2.將十六進位制數轉化為十進位制之後再轉化為8進位制
3.將十六進位制數直接轉為8進位制(推薦)

小編這裡用的是第三種方式,其餘遇到這種這種題目,我們都會想著直接點,越直接越好,那十六進位制直接轉為8進位制是什麼轉呢,實際上系統再執行的時候也是以二進位制的形式進行運算的,只是我們程式設計的時候可以跳過這些步驟

十六進位制轉為八進位制,可以發現,3為16進位制數等價於四位八進位制數,於是找到關係之後,我們就可以可是編寫我們的程式碼:

1.將使用者輸入的十六進位制數進行分解,3位為一組
2.計算分解後的數值,輸出結果

原始碼如下:

import java.util.Scanner;

public class Main {
    public static void main(String[] args) {
        new Main().systemScanner();
    }

    public void systemScanner() {
        Scanner scanner = new Scanner(System.in);
        while (scanner.hasNext()) {
            int length = scanner.nextInt(); //獲取十六進位制數的個數
            for (int i = 0; i < length; i++) {  //獲取具體的十六進位制數
                String str = scanner.next();
                //toCharArray()轉化為字元陣列,方便對二進位制位數進行操作
                tranform(str.toCharArray(), str.length());
            }
        }
    }

    /*
     * 3位16進位制等價於4位8進位制
     */
    int[] stack = new int[40000];

    public void tranform(char[] str, int length) {
        char[] buff = new char[4];
        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;
                // 將16進位制轉換成10進位制
                sum += (tmp << (4 * j));
            }
            // sum的結果是16進位制轉化10進位制的結果,每3個16進位制變成10進位制,再變8進位制
            stack[++top] = sum;
        }
        while (stack[top] == 0) {// 排除前導為0的判斷
            top--;
        }
        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();

    }
}

3.十六進位制轉十進位制

問題描述

從鍵盤輸入一個不超過8位的正的十六進位制數字符串,將它轉換為正的十進位制數後輸出。
注:十六進位制數中的10~15分別用大寫的英文字母A、B、C、D、E、F表示。

樣例輸入

FFFF

這個題目看似很簡單,但是時刻要注意細節問題,使用的儲存型別的選擇,我這裡選擇了Long型別

樣例輸出

65535

原始碼:

import java.util.Scanner;

public class Main {
    public static void main(String[] args) {
        String num = new Scanner(System.in).next();
            System.out.println(Long.parseLong(num, 16));
    }
}

4.十進位制轉十六進位制

問題描述

十六進位制數是在程式設計時經常要使用到的一種整數的表示方式。它有0,1,2,3,4,5,6,7,8,9,A,B,C,D,E,F共16個符號,分別表示十進位制數的0至15。十六進位制的計數方法是滿16進1,所以十進位制數16在十六進位制中是10,而十進位制的17在十六進位制中是11,以此類推,十進位制的30在十六進位制中是1E。
給出一個非負整數,將它表示成十六進位制的形式。

輸入格式

輸入包含一個非負整數a,表示要轉換的數。0<=a<=2147483647

輸出格式

輸出這個整數的16進製表示

原始碼:

import java.math.BigInteger;
import java.util.Scanner;

public class Main {
    public static void main(String[] args) {
        String num = new Scanner(System.in).nextLine();
        BigInteger bnum = new BigInteger(num);
        System.out.println(bnum.toString(16).toUpperCase());
    }
}

相關文章