(第七届蓝桥杯个人赛省赛)结果填空、代码填空

时间:2022-09-10 08:53:31

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

有一堆煤球,堆成三角棱锥形。具体:
第一层放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是不是相等的地方最好不要按照题目给出的方式去算。最好都转换成乘法。