1. 程式人生 > >(第七屆藍橋杯個人賽省賽)結果填空、程式碼填空

(第七屆藍橋杯個人賽省賽)結果填空、程式碼填空

一、煤球數目(暴力解法,容易)

有一堆煤球,堆成三角稜錐形。具體:
第一層放1個,
第二層3個(排列成三角形),
第三層6個(排列成三角形),
第四層10個(排列成三角形),
....
如果一共有100層,共有多少個煤球?

請填表示煤球總數目的數字。
注意:你提交的應該是一個整數,不要填寫任何多餘的內容或說明性文字。

分析:
不難看出,層與層之間是有關係的。
n = 1時,第n層的煤球數 = 1;
n >= 2時, 第n層的煤球數 = 第n層的層數 + 第n-1層的煤球數;

public class Main {

    /**
     * 煤球數目
     */
public static void main(String[] args) { int sum = 0; int n = 0; for (int i = 1; i <= 100 ; i++) { n += i;//計算出該層的煤球數 sum += n; } System.out.println(sum); } }

二、生日蠟燭(暴力解法,容易)

某君從某年開始每年都舉辦一次生日party,並且每次都要吹熄與年齡相同根數的蠟燭。

現在算起來,他一共吹熄了236根蠟燭。

請問,他從多少歲開始過生日party的?

請填寫他開始過生日party的年齡數。
注意:你提交的應該是一個整數,不要填寫任何多餘的內容或說明性文字。

分析:
不知道從幾歲開始,所以大致估計一個範圍,在這裡假設就是10歲~40歲之間。這個假設就相當於給出了for迴圈的範圍。針對這個範圍裡每一個數,比如15歲,從這個數開始(包括本身),每過一次生日,就加一次歲數,這樣一直加,加到最後無非就是2種結果:一是等於題目規定的數,二是大於題目規定的數。最後,把等於規定的數的最開始的歲數輸出即可。

public class Main {

    /**
     * 生日蠟燭
     */
    public static void main(String[] args) {
        int total = 236;
        int
flag = 0; for (int i = 10; i <=40; i++) { int sum = i; for (int j = i+1; ; j++) { sum += j; if (sum == total) { flag = 1; break; } if(sum > 236){ break; } } if (flag == 1) { System.out.println(i); break; } } } }

需要注意的地方:

每一次新的外層迴圈都要把sum重新賦值。

三、湊算式

     B      DEF
A + --- + ------- = 10
     C      GHI

這個算式中A~I代表1~9的數字,不同的字母代表不同的數字。

比如:
6+8/3+952/714 就是一種解法,
5+3/1+972/486 是另一種解法。

這個算式一共有多少種解法?

注意:你提交應該是個整數,不要填寫任何多餘的內容或說明性文字。

分析:
本題是個填空題,出於實用性優先的原則,這個題不需要很複雜的演算法,用暴力破解就可以了。

import java.util.HashSet;
import java.util.Set;

public class Main {

    /**
     * 湊算式
     */
    static boolean test(String s){
        Set<Character> sc = new HashSet<Character>();
        for(int i = 0; i < s.length();i++){
            sc.add(s.charAt(i));
        }
        if (sc.size() < 9) {
            return false;
        }
        return true;
    }

    public static void main(String[] args) {
        int count =0;
        for (int i = 1; i <= 9; i++) {
            for (int j = 1; j <= 9; j++) {
                for (int k = 1; k <= 9; k++) {
                    for (int l = 1; l <= 9; l++) {
                        for (int m = 1; m <= 9; m++) {
                            for (int n = 1; n <= 9; n++) {
                                for (int p = 1; p <= 9; p++) {
                                    for (int q = 1; q <= 9; q++) {
                                        for (int r = 1; r <= 9; r++) {
                                            String s = ""+i+j+k+l+m+n+p+q+r;
                                            int sum = (i*k*(p*100+q*10+r) + j*(p*100+q*10+r)+k*(l*100+m*10+n));
                                            if (sum == 10*k*(p*100+q*10+r) && test(s)) {
                                                count ++;
                                            }
                                        }
                                    }
                                }
                            }
                        }
                    }
                }
            }
        }

        System.out.println(count);
    }

}

這個程式跑出來需要30秒左右的時間。如果將判斷函式test()取消,並寫成if( i!=j && i != k && .....)格式,執行時間快。

需要注意的地方:

在判斷 算式和10是不是相等的地方最好不要按照題目給出的方式去算。最好都轉換成乘法。