藍橋杯部分題型(奇怪的比賽,電話號碼,palindrome)


未完待續!

2. 奇怪的比賽

某電視臺舉辦了低碳生活大獎賽。題目的計分規則相當奇怪:
每位選手需要回答10個問題(其編號爲1到10),越後面越有難度。答對的,
當前分數翻倍;答錯了則扣掉與題號相同的分數(選手必須回答問題,不回答按
錯誤處理)。
每位選手都有一個起步的分數爲10分。
某獲勝選手最終得分剛好是100分,如果不讓你看比賽過程,你能推斷出他
(她)哪個題目答對了,哪個題目答錯了嗎?
如果把答對的記爲1,答錯的記爲0,則10個題目的回答情況可以用僅含有1和
0的串來表示。例如:0010110011 就是可能的情況。
你的任務是算出所有可能情況。每個答案佔一行。

參考答案:
1011010000
0111010000
0010110011

import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import java.util.Scanner;

/**
 * @author guorui
 * @date 2020-06-25 16:23
 * @ 2. 奇怪的比賽
 * 某電視臺舉辦了低碳生活大獎賽。題目的計分規則相當奇怪:
 * 每位選手需要回答10個問題(其編號爲1到10),越後面越有難度。答對的,
 * 當前分數翻倍;答錯了則扣掉與題號相同的分數(選手必須回答問題,不回答按
 * 錯誤處理)。
 * 每位選手都有一個起步的分數爲10分。
 * 某獲勝選手最終得分剛好是100分,如果不讓你看比賽過程,你能推斷出他
 * (她)哪個題目答對了,哪個題目答錯了嗎?
 * 如果把答對的記爲1,答錯的記爲0,則10個題目的回答情況可以用僅含有1和
 * 0的串來表示。例如:0010110011 就是可能的情況。
 * 你的任務是算出所有可能情況。每個答案佔一行。
 * <p>
 * 參考答案:
 * 1011010000
 * 0111010000
 * 0010110011
 */
public class WeirdGame {

    /**
     * 將輸入的數字傳入,轉化爲所有全排列種數,將其轉化爲二進制形式,在for循環中,先將所有種類數字代表二進制算出,而一開始將種數最大值
     * 的二進制的位數算出,用最大的位數減去每個種數對應的二進制位數,所得結果先導0的個數。將先導0放在每個種類數字對應的二進制前面
     *
     * @param number
     * @return
     */
    public static List<String> calculator(int number) {
        List<String> allKind = new ArrayList<String>();
        int allKinds = calculate(number);
        String maxBinary = Integer.toBinaryString(allKinds);
        int maxDigit = maxBinary.length();
        for (int i = 1; i <= allKinds; i++) {
            String everyBinary = Integer.toBinaryString(i);
            int leadingZero = maxDigit - everyBinary.length();
            String zero = "";
            for (int j = 0; j < leadingZero - 1; j++) {
                zero += "0";
            }
            String finalarr = zero + everyBinary;
            allKind.add(finalarr);
        }
        return allKind;
    }

    /**
     * 將集合中的每一個位置上的內容按爲拆開。單獨保存在新的集合中
     *
     * @param
     */
    public static List<String> split(String str) {
        List<String> list = Arrays.asList(str.split(""));
        return list;
    }

    /**
     *
     */
    public static void cal(List<String> list,int finalGrade) {


        for (String i : list) {

            List<Integer> intList = new ArrayList<Integer>();
            List<String> str = WeirdGame.split(i);
            //將集合(每個位置上只有一個元素的)遍歷,賦值整形集合
            for (String j : str) {
                intList.add(Integer.parseInt(j));
            }
//            System.out.println("整形集合爲:"+intList.toString());
            //遍歷每個位置上元素,計算成績
            int grade = 10;
            for (int i1 = 0; i1 < intList.size(); i1++) {

                int number = intList.get(i1);
                if (number == 1) {
                    grade *= 2;
                }
                if (number == 0) {
                    grade -= i1 + 1;
                }
//                if(i1 == intList.size()-1){
//                    System.out.println("得分是:"+grade);
//                }
            }
            if (grade == finalGrade) {
                System.out.println(i + "的成績是"+finalGrade);
            }
//            else{
//                System.out.println("均無");
//            }
        }

    }

    /**
     * 返回有多少種可能的排列種類,即2的多少次方
     *
     * @param capacity
     * @return
     */
    private static int calculate(int capacity) {
        if (capacity == 0) {
            return 1;
        }
        return 2 * calculate(capacity - 1);
    }

    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        List<String> list = new ArrayList<String>();
        System.out.println("請輸入需要答題的個數:");
        list = WeirdGame.calculator(sc.nextInt());
        System.out.println("請輸入要統計的分數:");
        WeirdGame.cal(list,sc.nextInt());
//        System.out.println(list.toString());
//        System.out.println(list.size());
    }
}

輸入10,表示2^10次共1024種可能的情況,將這些0和1的字符串放在集合中,再將集合中的每一位字符串拆開放在新集合中(此集合爲Integer),邏輯判斷得分即可

3. palindrome

Statement of the Problem We say that a number is a palindrome if it is the sane when read from left to right or from right to left. For example, the number 75457 is a palindrome. Of course, the property depends on the basis in which is number is represented. The number 17 is not a palindrome in base 10, but its representation in base 2 (10001) is a palindrome. The objective of this problem is to verify if a set of given numbers are palindromes in any basis from 2 to 16. Input Format Several integer numbers comprise the input. Each number 0 < n < 50000 is given in decimal basis in a separate line. The input ends with a zero. Output Format
11
Your program must print the message Number i is palindrome in basis where I is the given number, followed by the basis where the representation of the number is a palindrome. If the number is not a palindrome in any basis between 2 and 16, your program must print the message Number i is not palindrome.

先來一段自己的翻譯

我們把從左往右和從右往左念起來相同的數字叫做迴文數。例如,75457就是一個迴文數。

當然某個數用某個進製表示不是迴文數,但是用別的進製表示可能就是迴文數。

例如,17是用十進制表示的數,顯然它不是一個迴文數,但是將17用二進制表示出來是10001,顯然在二進制下它是一個迴文數。

現在給你一個用十進制表示的數,請你判斷它在2~16進制下是否是迴文數。

輸入:輸入包含多組測試數據。每組輸入一個用十進制表示的正整數n(0<n<50000),當n=0時,輸入結束。

輸出:對於每組輸入,如果n在2~16進制中的某些進製表示下是迴文數,則輸出“Number i is palindrom in basis ”,在後面接着輸出那些進制。其中i用n的值代替,後面輸出的進制中,每兩個數字之間空一個。

如果n在2~16進制的表示下都不爲迴文數,則輸出“Number i is not palindrom”,其中i用n的值代替。

樣例輸入

17

19

0

樣例輸出

Number 17 is palindrome in basis 2 4 16

Number 19 is not palindrome

import java.util.ArrayList;
import java.util.List;
import java.util.Scanner;

/**
 * @author guorui
 * @date 2020-06-20 15:21
 * 我們把從左往右和從右往左念起來相同的數字叫做迴文數。例如,75457就是一個迴文數。
 * 當然某個數用某個進製表示不是迴文數,但是用別的進製表示可能就是迴文數。
 * 例如,17是用十進制表示的數,顯然它不是一個迴文數,但是將17用二進制表示出來是10001,顯然在二進制下它是一個迴文數。
 * 現在給你一個用十進制表示的數,請你判斷它在2~16進制下是否是迴文數。
 * 輸入
 * 輸入包含多組測試數據。每組輸入一個用十進制表示的正整數n(0<n<50000),當n=0時,輸入結束。
 * 輸出
 * 對於每組輸入,如果n在2~16進制中的某些進製表示下是迴文數,則輸出“Number i is palindrom in basis ”,在後面接着輸出那些進制。其中i用n的值代替,後面輸出的進制中,每兩個數字之間空一個。
 * 如果n在2~16進制的表示下都不爲迴文數,則輸出“Number i is not palindrom”,其中i用n的值代替。
 * 樣例輸入
 * 17
 * 19
 * 0
 * 樣例輸出
 * Number 17 is palindrom in basis 2 4 16
 * Number 19 is not palindrom
 */
public class Palindrome {
    public static void main(String[] args) {

        new Palindrome().init();

    }

    /**
     * 存放輸入輸出及判斷條件的框架
     */
    public void init() {
        Scanner sc = new Scanner(System.in);
        List<Integer> arr = new ArrayList<Integer>();
        while (true) {
            System.out.println("請輸入數字:");
            int number = sc.nextInt();
            if (number == 0) {
                System.out.println("輸入結束");
                break;
            } else if (number > 50000 || number < 0) {
                System.out.println("對不起,您輸入的數字超出範圍,請重試!");
                continue;
            }
            arr.add(number);

        }
        Palindrome t1 = new Palindrome();
        t1.iterator(arr);
    }

    /**
     * 遍歷list中每一個輸入元素
     *
     * @param arr
     */
    public void iterator(List arr) {

        for (Object number : arr) {
            int count = 0;
            for (int basis = 2; basis <= 16; basis++) {
                StringBuffer finalNumber = new StringBuffer(Integer.toString((int) number, basis));
                StringBuffer finalCount = new StringBuffer(finalNumber);
                finalNumber.reverse();
                if (finalNumber.toString().equals(finalCount.toString())) {
                    if (count == 0) {
                        System.out.print("Number " + number + " is palindrom in basis ");
                    }
                    System.out.print(basis + "\t");
                    count++;
                }
//                System.out.println(number+"的"+basis+"進制"+"的數字是:"+finalCount+",其迴文爲:"+finalNumber);
            }
            if (count == 0) {
                System.out.println("\nNumber " + number + " is not palindrome ");
            }
        }
    }
}

4. 電話號碼(其他來源,請參考)

輝子最近接到了一個棘手的任務,他們公司有一個電話簿,但是這是一個奇
怪的電話簿,因爲它不是用數字記錄電話號碼,而是用數字鍵上所對應的字母來
記錄電話號碼(2-abc,3-def,4-ghi,5-jkl,6-mno,7-pqrs,8-tuv,9-wxyz),電話號
碼只有11位。現在你的任務就是幫輝子寫一個程序來把這些字母的電話號碼轉化
成數字的電話號碼。
輸入:
第一行輸入一個正整數T(0<T<=100),表示測試數據的組數,每組測試數據只
有一行,輸入一串字符(字符長度爲11)。
輸出:
每組輸出佔一行,輸出數字的電話號碼。
例如:
樣例輸入
3
phqghumeayl
nlfdxfircvs
cxggbwkfnqd

樣例輸出
74744863295
65339347287
29442953673

import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import java.util.Scanner;

/**
 * @author Sun Weifeng
 * @date 2020-06-25 16:21
 */
public class PhoneNumber {

    public static void main(String[] args) {
        new init();
    }

}

/**
 * 啓動按鍵內部類
 */
class init{
    public init(){
        Scanner scanner = new Scanner(System.in);
        int num = scanner.nextInt();
        List<String> stringList = new ArrayList<>();

        for (int i = 0; i < num; i++) {
            String string = scanner.next();
            if (string.length() == 11) {
                String finalString =  iterator(string);
                stringList.add(finalString);
            } else {
                System.out.println("你輸入的不是11位,請重新運行程序");
            }
        }
        for (String s : stringList) {
            System.out.println(s);
        }
    }


    /**
     * 解析字符串方法
     * @param string
     * @return
     */
    public String iterator(String string) {
        List<String> list = Arrays.asList(string.split(""));
        StringBuffer stringBuffer = new StringBuffer();
        for (String s : list) {
            if (s.equals("a") || s.equals("b") || s.equals("c")) {
                stringBuffer.append(2);
            } else if (s.equals("d") || s.equals("e") || s.equals("f")) {
                stringBuffer.append(3);
            } else if (s.equals("g") || s.equals("h") || s.equals("i")) {
                stringBuffer.append(4);
            } else if (s.equals("j") || s.equals("k") || s.equals("l")) {
                stringBuffer.append(5);
            } else if (s.equals("m") || s.equals("n") || s.equals("o")) {
                stringBuffer.append(6);
            } else if (s.equals("p") || s.equals("q") || s.equals("r") || s.equals("s")) {
                stringBuffer.append(7);
            } else if (s.equals("t") || s.equals("u") || s.equals("v")) {
                stringBuffer.append(8);
            } else if (s.equals("w") || s.equals("x") || s.equals("y") || s.equals("z")) {
                stringBuffer.append(9);
            }
        }
        return stringBuffer.toString();
    }

}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章