天天看點

猿創征文 | Java知識【綜合練習】二

目錄

​​練習一:數字加密​​

​​練習二:數字解密​​

​​練習三:抽獎​​

​​解法一:​​

​​解法二:​​

​​練習四:雙色球​​

練習一:數字加密

需求:

某系統的數字密碼(大于0),比如1983,采用加密方式進行傳輸。

規則如下:

先得到每位數,然後每位數都加上5 , 再對10求餘,最後将所有數字反轉,得到一串新數。

舉例:

1  9  8  3
+5    6   14  13  8
%10    6   4   3   8
反轉     8   3   4   6
加密後的結果就是:8346      

代碼示例:  

public class Test6 {
    public static void main(String[] args) {
        /*
        某系統的數字密碼(大于0)。比如1983,采用加密方式進行傳輸,
        規則如下:
            每位數加上5
            再對10求餘,
            最後将所有數字反轉,
            得到一串新數。
*/


        //分析:
        //1.把整數裡面的每一位放到數組當中
        int[] arr = {1, 9, 8, 3};
        //2.加密
        //每位數加上5
        for (int i = 0; i < arr.length; i++) {
            arr[i] = arr[i] + 5;
        }
        //再對10求餘,
        for (int i = 0; i < arr.length; i++) {
            arr[i] = arr[i] % 10;
        }
        //将所有數字反轉
        for (int i = 0, j = arr.length - 1; i < j; i++, j--) {
            int temp = arr[i];
            arr[i] = arr[j];
            arr[j] = temp;
        }
        //8 3 4 6 --> 8346
        //3.把數組裡面的每一個數字進行拼接,變成加密之後的結果
        int number = 0;
        for (int i = 0; i < arr.length; i++) {
            number = number * 10 + arr[i];
        }
        System.out.println(number);
    }
}      

拓展:

public class Test7 {
    public static void main(String[] args) {
        //需求:
        //把整數上的每一位都添加到數組當中
        //反向推導



        //1.計算出數組的長度
        int number = 12345;
        //定義一個變量臨時記錄number的值,就是為了第三步的時候再次使用
        int temp = number;
        //定義一個變量進行統計
        int count = 0;
        while(number != 0){
            //每一次循環就去掉右邊的一個數字
            number = number / 10;
            //去掉一位計數器就自增一次。
            count++;
        }
        //2.定義數組
        //動态初始化
        int[] arr = new int[count];
        //3.把整數上的每一位都添加到數組當中
        int index = arr.length -1;
        while(temp != 0){//12345
            //擷取temp裡面的每一位數組
            int ge = temp % 10;
            //再去掉右邊的那位數字
            temp = temp / 10;
            //把目前擷取到的個位添加到數組當中
            arr[index] = ge;
            index--;
        }
        //驗證結果  1  2  3  4 5
        for (int i = 0; i < arr.length; i++) {
            System.out.print(arr[i] + " ");
        }
    }
}      

練習二:數字解密

把上一題加密之後的資料進行解密

代碼示例:

public class Test8 {
    public static void main(String[] args) {
        /*某系統的數字密碼(大于0)。比如1983,采用加密方式進行傳輸,
        規則如下:
            每位數加上5
            再對10求餘,
            最後将所有數字反轉,
            得到一串新數。
            按照以上規則進行解密:
            比如1983加密之後變成8346,解密之後變成1983
        */


        //1.定義數組記錄解密之後的結果
        int[] arr = {8, 3, 4, 6};
        //2.反轉
        for (int i = 0, j = arr.length - 1; i < j; i++, j--) {
            int temp = arr[i];
            arr[i] = arr[j];
            arr[j] = temp;
        }
        //3.由于加密是通過對10取餘的方式進行擷取的
        //是以在解密的時候就需要判斷,0~4之間+10  5~9數字不變
        for (int i = 0; i < arr.length; i++) {
            if (arr[i] >= 0 && arr[i] <= 4) {
                arr[i] = arr[i] + 10;
            }
        }
        //4.每一位減5
        for (int i = 0; i < arr.length; i++) {
            arr[i] = arr[i] - 5;
        }
        //5.擷取數組裡面的每一位數字拼接成最終的結果
        int number = 0;
        for (int i = 0; i < arr.length; i++) {
            number = number * 10 + arr[i];
        }
        System.out.println(number);




    }
}      

練習三:抽獎

需求:

一個大V直播抽獎,獎品是現金紅包,分别有{2, 588 , 888, 1000, 10000}五個獎金。請使用代碼模拟抽獎,列印出每個獎項,獎項的出現順序要随機且不重複。列印效果如下:(随機順序,不一定是下面的順序)

888元的獎金被抽出
588元的獎金被抽出
10000元的獎金被抽出
1000元的獎金被抽出
2元的獎金被抽出      

解法一:

public class Test9 {
    public static void main(String[] args) {
        /* 需求:
        一個大V直播抽獎,獎品是現金紅包,分别有{2, 588 , 888, 1000, 10000}五個獎金。
        請使用代碼模拟抽獎,列印出每個獎項,獎項的出現順序要随機且不重複。
        列印效果如下:(随機順序,不一定是下面的順序)
            888元的獎金被抽出
            588元的獎金被抽出
            10000元的獎金被抽出
            1000元的獎金被抽出
            2元的獎金被抽出
        */


        //分析:
        //1.定義數組表示獎池
        int[] arr = {2, 588, 888, 1000, 10000};
        //2.定義新數組用于存儲抽獎的結果
        int[] newArr = new int[arr.length];
        //3.抽獎
        Random r = new Random();
        //因為有5個獎項,是以這裡要循環5次
        for (int i = 0; i < 5; ) {
            //擷取随機索引
            int randomIndex = r.nextInt(arr.length);
            //擷取獎項
            int prize = arr[randomIndex];
            //判斷目前的獎項是否存在,如果存在則重新抽取,如果不存在,就表示是有效獎項
            boolean flag = contains(newArr, prize);
            if(!flag){
                //把目前抽取到的獎項添加到newArr當中
                newArr[i] = prize;
                //添加完畢之後,移動索引
                i++;
            }
        }
        //4.周遊newArr
        for (int i = 0; i < newArr.length; i++) {
            System.out.println(newArr[i]);
        }


    }

    //判斷prize在數組當中是否存在
    //存在:true
    //不存在:false
    public static boolean contains(int[] arr,int prize){
        for (int i = 0; i < arr.length; i++) {
            if(arr[i] == prize){
                return true;
            }
        }
        return false;
    }


}      

解法二:

public class Test10 {
    public static void main(String[] args) {
       /* 需求:
        一個大V直播抽獎,獎品是現金紅包,分别有{2, 588 , 888, 1000, 10000}五個獎金。
        請使用代碼模拟抽獎,列印出每個獎項,獎項的出現順序要随機且不重複。
        列印效果如下:(随機順序,不一定是下面的順序)
            888元的獎金被抽出
            588元的獎金被抽出
            10000元的獎金被抽出
            1000元的獎金被抽出
            2元的獎金被抽出
        */

        //1.把獎池裡面的所有獎項打亂順序
        int[] arr = {2, 588, 888, 1000, 10000};
        Random r = new Random();
        for (int i = 0; i < arr.length; i++) {
            //擷取随機索引
            int randomIndex = r.nextInt(arr.length);
            //拿着i跟随機索引randomIndex上的值進行交換
            int temp = arr[i];
            arr[i] = arr[randomIndex];
            arr[randomIndex] = temp;
        }
        //2.周遊獎池,從0索引開始擷取每一個獎項
        for (int i = 0; i < arr.length; i++) {
            System.out.println(arr[i]);
        }


    }
}      

練習四:雙色球

public class Test11 {
    public static void main(String[] args) {
        //1.生成中獎号碼
        int[] arr = createNumber(); // 123456  7

        System.out.println("=======================");
        for (int i = 0; i < arr.length; i++) {
            System.out.print(arr[i] + " ");
        }

        System.out.println("=======================");



        //2.使用者輸入彩票号碼(紅球 + 藍球)//654321
        int[] userInputArr = userInputNumber();

        //3.判斷使用者的中獎情況
        //紅球 藍球
        int redCount = 0;
        int blueCount = 0;

        //判斷紅球
        for (int i = 0; i < userInputArr.length - 1; i++) {
            int redNumber = userInputArr[i];
            for (int j = 0; j < arr.length - 1; j++) {
                if(redNumber == arr[j]){
                    redCount++;
                    //如果找到了,那麼後面的數字就沒有必要繼續比較了
                    //跳出内循環,繼續判斷下一個紅球号碼是否中獎
                    break;
                }
            }
        }

        //判斷藍球
        int blueNumber = userInputArr[userInputArr.length-1];
        if(blueNumber == arr[arr.length - 1]){
            blueCount++;
        }

        //根據紅球的個數以及藍球的個數來判斷中獎情況
        if(redCount == 6 && blueCount == 1){
            System.out.println("恭喜你,中獎1000萬");
        }else if(redCount == 6 && blueCount == 0){
            System.out.println("恭喜你,中獎500萬");
        }else if(redCount == 5 && blueCount == 1){
            System.out.println("恭喜你,中獎3000");
        }else if((redCount == 5 && blueCount == 0) ||  (redCount == 4 && blueCount == 1)){
            System.out.println("恭喜你,中獎200");
        }else if((redCount == 4 && blueCount == 0) ||  (redCount == 3 && blueCount == 1)){
            System.out.println("恭喜你,中獎10");
        }else if((redCount == 2 && blueCount == 1) ||  (redCount == 1 && blueCount == 1)|| (redCount == 0 && blueCount == 1)){
            System.out.println("恭喜你,中獎5");
        }else{
            System.out.println("謝謝參與,謝謝惠顧");
        }

    }

    public static int[] userInputNumber() {
        //1.建立數組用于添加使用者購買的彩票号碼
        //6個紅球 1個藍球 數組長度:7
        int[] arr = new int[7];

        //2.利用鍵盤錄入讓用輸入
        Scanner sc = new Scanner(System.in);
        //讓使用者輸入紅球号碼
        for (int i = 0; i < 6; ) {
            System.out.println("請輸入第" + (i + 1) + "個紅球号碼");
            int redNumber = sc.nextInt();
            //redNumber  在1~33  唯一不重複
            if (redNumber >= 1 && redNumber <= 33) {
                boolean flag = contains(arr, redNumber);
                if (!flag) {
                    //不存在
                    //有效的,可以添加到數組當中
                    arr[i] = redNumber;
                    i++;
                } else {
                    //存在
                    System.out.println("目前紅球号碼已經存在,請重新輸入");
                }
            } else {
                System.out.println("目前紅球号碼超出範圍");
            }
        }

        //讓使用者輸入籃球号碼
        System.out.println("請輸入籃球号碼");
        //1~16
        while (true) {
            int blueNumber = sc.nextInt();
            if (blueNumber >= 1 && blueNumber <= 16) {
                arr[arr.length - 1] = blueNumber;
                break;
            } else {
                System.out.println("目前籃球号碼超出範圍");
            }
        }
        return arr;

    }


    public static int[] createNumber() {
        //1.建立數組用于添加中獎号碼
        //6個紅球 1個藍球 數組長度:7
        int[] arr = new int[7];

        //2.随機生成号碼并添加到數組當中
        //紅球:不能重複的  1 2 3 4 5 6
        //藍球:可以跟紅球号碼重複 5

        //生成紅球号碼并添加到數組當中
        Random r = new Random();
        for (int i = 0; i < 6; ) {
            //擷取紅球号碼
            int redNumber = r.nextInt(33) + 1;
            boolean flag = contains(arr, redNumber);
            if (!flag) {
                //把紅球号碼添加到數組當中
                arr[i] = redNumber;
                i++;
            }
        }

        //生成藍球号碼并添加到數組當中
        int blueNumber = r.nextInt(16) + 1;
        arr[arr.length - 1] = blueNumber;
        return arr;
    }

    //用于判斷數組在數組中是否存在
    public static boolean contains(int[] arr, int number) {
        for (int i = 0; i < arr.length; i++) {
            if (arr[i] == number) {
                return true;
            }
        }
        return false;
    }
}