2015年第六届蓝桥杯JavaB组省赛试题解析

题目及解析如下:

题目大致介绍:

第一题到第三题以及第六题、第七题是结果填空,方法不限只要得到最后结果就行

第四题和第五题是代码填空题,主要考察算法基本功和编程基本功

第八题到第十题是编程题,要求编程解决问题

第一题  三角形面积

送分题,每个人都应该会的

 1 // 三角形面积
 2 // answer: 28
 3 
 4 public class t1 {
 5 
 6     public static void main(String[] args) {
 7         System.out.println(64 - 8 - 3 * 4 - 4 * 4);
 8     }
 9     
10 }

第二题  立方变自身

 1 // 立方变自身
 2 // 观察下面的现象,某个数字的立方,按位累加仍然等于自身。
 3 // 1^3 = 1 
 4 // 8^3  = 512    5+1+2=8
 5 // 17^3 = 4913   4+9+1+3=17
 6 // ...
 7 // 请你计算包括1,8,17在内,符合这个性质的正整数一共有多少个?
 8 
 9 // answer: 6
10 
11 public class t2 {
12     
13     public static void main(String[] args) {
14         int res = 0;
15         for(int i = 1; i<99; i++) {
16             int s = i * i * i;
17             int sum = calSum(s);
18             if(sum == i) {
19                 res++;
20                 System.out.println(res + " " + i);
21             }
22         }
23         
24         System.out.println(res);
25     }
26 
27     private static int calSum(int s) {
28         String str = String.valueOf(s);
29         int sum = 0;
30         for(int i = 0; i<str.length(); i++) {
31             sum += str.charAt(i) - '0';
32         }
33         
34         
35         return sum;
36     }
37     
38 }

这个题也算是送分题

第三题  三羊献瑞

暴力求解,注意看清楚,别看错了!然后可以推导出某些位置的数,比如下面的三就是1,祥就是9,羊就是0

 1 // 三羊献瑞
 2 
 3 // 观察下面的加法算式:
 4 //
 5 //
 6 //      祥 瑞 生 辉
 7 //  +   三 羊 献 瑞
 8 //-------------------
 9 //   三 羊 生 瑞 气
10 //
11 //
12 // 其中,相同的汉字代表相同的数字,不同的汉字代表不同的数字。
13 //
14 // 请你填写“三羊献瑞”所代表的4位数字(答案唯一),不要填写任何多余内容
15 
16 // answer: 1085
17 
18 public class t3 {
19 
20     public static void main(String[] args) {
21 
22         for (int a = 1; a <= 9; a++) {
23             for (int b = 0; b <= 9; b++) {
24                 if(b!=a)
25                 for (int c = 0; c <= 9; c++) {
26                     if(c!=a&&c!=b)
27                     for (int d = 0; d <= 9; d++) {
28                         if(d!=c&&d!=b&&d!=a)
29                         for (int i = 1; i <= 9; i++) {
30                             if(i!=d&&i!=c&&i!=b&&i!=a)
31                             for (int j = 0; j <= 9; j++) {
32                                 if(j!=i&&j!=d&&j!=c&&j!=b&&j!=a)
33                                 for (int k = 0; k <= 9; k++) {
34                                     int num1 = a * 1000 + b * 100 + c * 10 + d;
35                                     int num2 = i * 1000 + j * 100 + k * 10 + b;
36                                     int res = num1 + num2;
37                                     if(k!=j&&k!=i&&k!=d&&k!=c&&k!=b&&k!=a)
38                                     for(int q=0; q<=9; q++) {
39                                         int aim = i * 10000 + j * 1000 + c * 100 + b * 10 + q;
40                                         if(q!=k&&q!=j&&q!=i&&q!=d&&q!=c&&q!=b&&q!=a)
41                                         if(res == aim) {
42                                             System.out.println(num1 + " + " + num2 + " = " + res + " aim: " + aim);
43                                         }
44                                     }
45                                 }
46                             }
47                         }
48                     }
49                 }
50             }
51         }
52 
53     }
54 
55 }

第四题  循环节长度

 1 // 循环节长度
 2 
 3 // 两个整数做除法,有时会产生循环小数,其循环部分称为:循环节。
 4 // 比如,11/13=6=>0.846153846153.....  其循环节为[846153] 共有6位。
 5 // 下面的方法,可以求出循环节的长度。
 6 //
 7 //
 8 // 请仔细阅读代码,并填写划线部分缺少的代码。
 9 
10 public class t4 {
11 
12     public static int f(int n, int m) {
13         n = n % m;
14         Vector v = new Vector();
15 
16         for (;;) {
17             v.add(n);
18             n *= 10;
19             n = n % m;
20             if (n == 0)
21                 return 0;
22             if (v.indexOf(n) >= 0) {
23                 return v.size() - v.indexOf(n); // 填空
24             }
25         }
26     }
27 
28     public static void main(String[] args) {
29 
30         for (int i = 1; i <= 17; i++) {
31             for (int j = 1; j <= 17; j++) {
32                 if (i % j != 0) {
33                     System.out.println(i + " " + j + " " + (double)i/j + " " + f(i, j));
34                 }
35             }
36         }
37         
38 
39     }
40 
41 }

第五题 九数组分数

很简单的暴力法,注意使用全排列套路:

 1 // 九数组分数
 2 
 3 // 1,2,3...9 这九个数字组成一个分数,其值恰好为1/3,如何组法?
 4 // 下面的程序实现了该功能,请填写划线部分缺失的代码。
 5 
 6 // 答案如下:
 7 // 5832 17496
 8 // 5823 17469
 9 
10 public class t5 {
11     public static void test(int[] x) {
12         // 测试函数  检测是否符合条件
13         int a = x[0] * 1000 + x[1] * 100 + x[2] * 10 + x[3];
14         int b = x[4] * 10000 + x[5] * 1000 + x[6] * 100 + x[7] * 10 + x[8];
15         if (a * 3 == b)
16             System.out.println(a + " " + b);
17     }
18 
19     public static void f(int[] x, int k) {
20         if (k >= x.length) {
21             test(x);
22             return;
23         }
24 
25         // 1, 2, 3, 4, 5, 6, 7, 8, 9
26         
27         for (int i = k; i < x.length; i++) {
28             // 下面是全排列的套路代码  你应该背下来
29             {
30                 int t = x[k];
31                 x[k] = x[i];
32                 x[i] = t;
33             }
34             f(x, k + 1);
35             {
36                 int t = x[k];
37                 x[k] = x[i];
38                 x[i] = t;
39             }
40         }
41     }
42 
43     public static void main(String[] args) {
44         int[] x = { 1, 2, 3, 4, 5, 6, 7, 8, 9 };
45         // 用数组x来保存这个分数
46         // 前四个是分子 后六个是分母
47         f(x, 0);
48     }
49 }

第六题 加法变乘法

 1 // 我们都知道:1+2+3+ ... + 49 = 1225
 2 //
 3 // 现在要求你把其中两个不相邻的加号变成乘号,使得结果为2015
 4 //
 5 // 比如:
 6 // 1+2+3+...+10*11+12+...+27*28+29+...+49= 2015
 7 // 就是符合要求的答案。
 8 //
 9 //
10 // 请你寻找另外一个可能的答案,并把位置靠前的那个乘号左边的数字提交(对于示例,就是提交10)。
11 //
12 // 注意:需要你提交的是一个整数,不要填写任何多余的内容
13 
14 // answer:
15 // 16
16 
17 // i j        m n
18 // i*j + m*n - (i + j + m + n) == 2015 - 1225
19 
20 public class t6 {
21     public static void main(String[] args) {
22         
23         for(int i=10; i<=50; i++) {
24             int j = i+1;
25             for(int m=j+2; m<=50; m++) {
26                 int n = m + 1;
27                 if(i*j + m*n - (i + j + m + n) == 2015 - 1225) {
28                     System.out.println(i + " " + j);
29                 }
30             }
31             
32             
33         }
34         
35     }
36 }

第七题  牌型种数

 1 // 牌型种数
 2 // 小明被劫持到X赌城,被迫与其他3人玩牌。
 3 //
 4 // 一副扑克牌(去掉大小王牌,共52张),均匀发给4个人,每个人13张。
 5 //
 6 // 这时,小明脑子里突然冒出一个问题:
 7 //
 8 // 如果不考虑花色,只考虑点数,也不考虑自己得到的牌的先后顺序,自己手里能拿到的初始牌型组合一共有多少种呢?
 9 
10 // 思路: 13 堆牌,每堆 4 个,每堆可选 0 到 4 个,只要总数为 13 即可
11 // 答案: 3598180
12 
13 public class t7 {
14     
15     
16     public static int res;
17     public static void dfs(int type, int sum) {
18         if(sum > 13 || type > 13) {
19             res += 0;
20             return;
21         }
22         if(type == 13 && sum==13) {
23             res += 1;
24             return;
25         }
26         for(int i=0; i<=4; i++){
27             dfs(type+1, sum+i);
28         }
29     }
30     
31     
32     public static void main(String[] args) {
33         dfs(0, 0);
34         System.out.println(res);
35     }
36     
37 }

第八题  饮料换购

第一道编程题,很简单:

 1 import java.util.Scanner;
 2 
 3 // 饮料换购
 4 // 乐羊羊饮料厂正在举办一次促销优惠活动。乐羊羊C型饮料,凭3个瓶盖可以再换一瓶C型饮料,并且可以一直循环下去,但不允许赊账。
 5 //
 6 // 请你计算一下,如果小明不浪费瓶盖,尽量地参加活动,那么,对于他初始买入的n瓶饮料,最后他一共能得到多少瓶饮料。
 7 //
 8 // 输入:一个整数n,表示开始购买的饮料数量(0<n<10000)
 9 // 输出:一个整数,表示实际喝完的饮料数
10 //
11 // 例如:
12 // 用户输入:
13 // 100
14 // 程序应该输出:
15 // 149
16 //
17 // 用户输入:
18 // 101
19 // 程序应该输出:
20 // 151
21 
22 public class t8 {
23 
24     private static Scanner input;
25 
26     public static int f(int n) {
27         int res = n;
28         while (n >= 3) {
29             n -= 2;
30             res += 1;
31         }
32         
33         
34         return res;
35     }
36 
37     public static void main(String[] args) {
38         input = new Scanner(System.in);
39         System.out.println(": ");
40         int n = input.nextInt();
41         System.out.println(f(n));
42 
43     }
44 
45 }

第九题  垒骰子

第十题  生命之树

第九题和第十题有一定难度,不做研究了,时间没有那么多。。。。 

原文地址:https://www.cnblogs.com/wyb666/p/10787363.html