题目及解析如下:
题目大致介绍:
第一题到第三题以及第六题、第七题是结果填空,方法不限只要得到最后结果就行
第四题和第五题是代码填空题,主要考察算法基本功和编程基本功
第八题到第十题是编程题,要求编程解决问题
第一题 三角形面积
送分题,每个人都应该会的
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 }
第九题 垒骰子
第十题 生命之树
第九题和第十题有一定难度,不做研究了,时间没有那么多。。。。