算法筆記_121:藍橋杯第六屆省賽(Java語言C組部分習題)試題解答


 目錄

1 隔行變色

2 立方尾不變

3 無窮分數

4 格子中輸出

5 奇妙的數字

6 打印大X

 

  前言:以下試題解答代碼部分僅供參考,若有不當之處,還請路過的同學提醒一下~


1 隔行變色

 

隔行變色

Excel表的格子很多,為了避免把某行的數據和相鄰行混淆,可以采用隔行變色的樣式。
小明設計的樣式為:第1行藍色,第2行白色,第3行藍色,第4行白色,....
現在小明想知道,從第21行到第50行一共包含了多少個藍色的行。

請你直接提交這個整數,千萬不要填寫任何多余的內容。

15

 

public class Main {
    
    public static void main(String[] args) {
        int count = 0;
        for(int i = 21;i <= 50;i++) {
            if(i % 2 == 1)
                count++;
        }
        System.out.println(count);
    }
}

 

 

 

2 立方尾不變

 

立方尾不變

有些數字的立方的末尾正好是該數字本身。
比如:1,4,5,6,9,24,25,....

請你計算一下,在10000以內的數字中(指該數字,並非它立方后的數值),符合這個特征的正整數一共有多少個。

請提交該整數,不要填寫任何多余的內容。

36

 

public class Main {
    
    public static void main(String[] args) {
        int count = 0;
        for(long i = 1;i <= 10000;i++) {
            long temp = i * i * i;
            String A = temp + "";
            String B = i + "";
            int len = B.length();
            int judge = Integer.valueOf(A.substring(A.length() - len, A.length()));
            if(i == judge) {
                System.out.println("i = "+i+", A = "+A);
                count++;
            }
        }
        System.out.println(count);
    }
}

 

 

 

3 無窮分數

 

無窮分數

無窮的分數,有時會趨向於固定的數字。
請計算【圖1.jpg】所示的無窮分數,要求四舍五入,精確到小數點后5位,小數位不足的補0。

請填寫該浮點數,不能填寫任何多余的內容。
0.58198

 

public class Main {
    
    public static void main(String[] args) {
        
        double temp = 10000000 * 1.0 / 1000001;
        double result = 0;
        for(int i = 10000000;i >= 1;i--) {
            result = i - 1 + temp;
            temp = (i - 1) / result;
        }
        System.out.printf("%.5f",result);
    }
}

 

 

 

4 格子中輸出

 

格子中輸出

stringInGrid方法會在一個指定大小的格子中打印指定的字符串。
要求字符串在水平、垂直兩個方向上都居中。
如果字符串太長,就截斷。
如果不能恰好居中,可以稍稍偏左或者偏上一點。

下面的程序實現這個邏輯,請填寫划線部分缺少的代碼。

    public static void stringInGrid(int width, int height, String s)
    {
        if(s.length()>width-2) s = s.substring(0,width-2);
        System.out.print("+");
        for(int i=0;i<width-2;i++) System.out.print("-");
        System.out.println("+");
        
        for(int k=1; k<(height-1)/2;k++){
            System.out.print("|");
            for(int i=0;i<width-2;i++) System.out.print(" ");
            System.out.println("|");
        }
        
        System.out.print("|");
        
        String ff = _______________________________________________________;  //填空
        System.out.print(String.format(ff,"",s,""));
                  
        System.out.println("|");
        
        for(int k=(height-1)/2+1; k<height-1; k++){
            System.out.print("|");
            for(int i=0;i<width-2;i++) System.out.print(" ");
            System.out.println("|");
        }    
        
        System.out.print("+");
        for(int i=0;i<width-2;i++) System.out.print("-");
        System.out.println("+");    
    }

對於題目中數據,應該輸出:
+------------------+
|                  |
|     abcd1234     |
|                  |
|                  |
+------------------+

(如果出現對齊問題,參看【圖1.jpg】)

//注意:ff中有三個%s分別對應第一段空格字符,第二段函數給定變量s字符串字符,第三段空格字符
//其中%s表示打印一個字符串變量,%is表示打印出長度為i的空格字符串
//System.out.print(String.format(ff,"",s,""));該語句后面"",s,""分別表示變量1,2,3。即對應第一段字符串,第二段字符串,第三段字符串。而ff則為輸出格式。

"%"+((width-2-s.length())/2)+"s%s%"+((width-1-s.length())/2)+"s"

 

 

 

 

5 奇妙的數字

 

奇妙的數字

小明發現了一個奇妙的數字。它的平方和立方正好把0~9的10個數字每個用且只用了一次。
你能猜出這個數字是多少嗎?

請填寫該數字,不要填寫任何多余的內容。

69

 

import java.util.Arrays;

public class Main {
    
    public static void main(String[] args) {
        for(long i = 10;i < 200;i++) {
            long temp1 = i * i;
            long temp2 = i * i * i;
            String A = temp1 + "";
            String B = temp2 + "";
            int len = A.length() + B.length();
            if(len == 10) {
                long[] array = new long[10];
                int j = 0;
                while(temp1 > 0) {
                    array[j++] = temp1 % 10;
                    temp1 = temp1 / 10;
                }
                while(temp2 > 0) {
                    array[j++] = temp2 % 10;
                    temp2 = temp2 / 10;
                }
                Arrays.sort(array);
                for(j = 0;j < 10;j++) {
                    if(array[j] == j)
                        continue;
                    else
                        break;
                }
                if(j == 10)
                    System.out.println("i = "+i+", i^2 = "+(i*i)+", i^3 = "+(i*i*i));
            }
        }
    }
}

 

 

 

6 打印大X

 

打印大X

小明希望用星號拼湊,打印出一個大X,他要求能夠控制筆畫的寬度和整個字的高度。
為了便於比對空格,所有的空白位置都以句點符來代替。

要求輸入兩個整數m n,表示筆的寬度,X的高度。用空格分開(0<m<n, 3<n<1000, 保證n是奇數)
要求輸出一個大X

例如,用戶輸入:
3 9
程序應該輸出:
***.....***
.***...***.
..***.***..
...*****...
....***....
...*****...
..***.***..
.***...***.
***.....***

(如有對齊問題,參看【圖1.jpg】)

再例如,用戶輸入:
4 21
程序應該輸出
****................****
.****..............****.
..****............****..
...****..........****...
....****........****....
.....****......****.....
......****....****......
.......****..****.......
........********........
.........******.........
..........****..........
.........******.........
........********........
.......****..****.......
......****....****......
.....****......****.....
....****........****....
...****..........****...
..****............****..
.****..............****.
****................****

(如有對齊問題,參看【圖2.jpg】)


資源約定:
峰值內存消耗(含虛擬機) < 256M
CPU消耗  < 1000ms


請嚴格按要求輸出,不要畫蛇添足地打印類似:“請您輸入...” 的多余內容。

所有代碼放在同一個源文件中,調試通過后,拷貝提交該源碼。
注意:不要使用package語句。不要使用jdk1.7及以上版本的特性。
注意:主類的名字必須是:Main,否則按無效代碼處理。
import java.util.Scanner;

public class Main {
    
    public static void main(String[] args) {
        Scanner in = new Scanner(System.in);
        int m = in.nextInt();
        int n = in.nextInt();
        char[][] A = new char[n][n + m - 1];
        for(int i = 0;i < n;i++)
            for(int j = 0;j < n + m - 1;j++)
                A[i][j] = '.';
        int mid = n / 2;
        for(int i = 0;i <= mid;i++) {
            int startL = i, endL = i + m - 1;      //X左邊星號開始於截止縱坐標
            int startR = n  - 1 - i, endR = n + m - 2 - i; //X右邊星號起止縱坐標
            for(int j = startL;j <= endL;j++) {
                A[i][j] = '*';
                A[n - 1 - i][j] = '*';
            }
            for(int j = startR;j <= endR;j++) {
                A[i][j] = '*';
                A[n - 1 - i][j] = '*';
            }
        }
        //打印題意結果
        for(int i = 0;i < n;i++) {
            for(int j = 0;j < n + m - 1;j++)
                System.out.print(A[i][j]);
            System.out.println();
        }
    }
}

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM