21-25题
21.试题编号:J1-21《密码破解系统》关键算法
(1)任务描述 二战中,盟军因为破译了德军的通信密码,成功的赢得了多次重大战役的胜利。现在某 国军方决定开发一套密码破译系统,以便在战时破译敌方的通信密码。密码破解系统需要使 用不少破解算法,其中枚举算法是非常重要的密码破解算法之一。请完成以下任务来测试该 系统的枚举算法的正确性。
任务一:实现枚举问题 1 关键算法并绘制流程图(30 分) 我们都知道:1+2+3+ ... + 49 = 1225。现在要求你把其中两个不相邻的加号变成乘号, 使得结果为 2015。 例如: 1+2+3+...+10*11+12+...+27*28+29+...+49 = 2015 就是符合要求的答案。 请你寻找所有可能的答案,并把前面的两个数字输出,如上面的就是输出(10 27)。 注意:使用循环或者递归实现。
/* * */ public class Task1 { public static void main(String[] args) { // 1+2+3+ ... + 49 = 1225 // 现在要求你把其中两个不相邻的加号变成乘号,使得结果为2015 int quehou=0; for(int a=0;a<50;a++){ //穷举到50 for(int b=a;b<50;b++){ quehou=1225-a*2-b*2-2; //减掉四个没有加上去的数,减2是a*2和b*2多出来的2 if(quehou+a*(a+1)+b*(b+1)==2015)//筛选变成乘法之后的数 { System.out.println(a+" "+b); } } } } }
任务二:实现枚举问题 2 关键算法并绘制流程图(30 分) 美国数学家维纳(N.Wiener)智力早熟,11 岁就上了大学。他曾在 1935~1936 年应邀来 中国清华大学讲学。 一次,他参加某个重要会议,年轻的脸孔引人注目。于是有人询问他的年龄,他回答说: “我年龄的立方是个 4 位数。我年龄的 4 次方是个 6 位数。这 10 个数字正好包含了从 0 到 9 这 10 个数字,每个都恰好出现 1 次。”请你编程计算,他当时到底有多年轻。
注意:使用循环实现,输出他的年龄在一行。
import java.util.HashSet; /* *我年龄的立方是个4位数。 *我年龄的4次方是个6位数。 *这10个数字正好包含了从0到9这10个数字,每个都恰好出现1次。 * */ public class Task2 { public static void main(String[] args) { int age = 1; while (true) { String num1 = String.valueOf((int)Math.pow(age, 3));//开始没加int,Math.pow(age, 3)为double类型 String num2 = String.valueOf((int)Math.pow(age, 4)); if (num1.length() == 4 && num2.length() == 6) { if (fun(num1+num2)) { System.out.println("年龄为:"+age); System.out.println("立方为:"+num1); System.out.println("4次方为:"+num2); break; } } else { age++;//不符合条件age++ } } } public static boolean fun(String num) {//这10个数字正好包含了从0到9这10个数字,每个都恰好出现1次。 //判断是否重复,加入到set集合中的元素不能重复 HashSet<Character> set = new HashSet<Character>();//比较相同 for (int i = 0; i < num.length(); i++) { if (!set.add(num.charAt(i))) {//如果重复返回false return set.add(num.charAt(i)); } } return true; } }
任务三:实现枚举问题 3 关键算法并绘制流程图(30 分) 小米打算把图标设计成下面这样,但是他不知道几层最合适,于是想写个程序,打印出 不同层的图标,请你帮帮他。
—
———
—————
———————
注意:输入 n,打印 n 层高度的图标,如图是 4 层。 (2)作品提交要求见本模块附录 1 (3)实施条件要求见本模块附录 2 (4)评价标准见本模块附录 3
import java.util.Scanner; /* *打印图标 */ public class Task3 { public static void main(String[] args) { System.out.print("输入n:"); Scanner s = new Scanner(System.in); int n = s.nextInt(); for (int i = 1; i <= n; i++) {//打印行 for (int k = n-1; k >=i; k--) {//打印每行空格 System.out.print(" "); } for (int j = 1; j <= 2*i-1; j++) {//打印每行个数 System.out.print("-"); } System.out.println(); } } }
22.试题编号:J1-22《警务系统》关键算法
(1)任务描述 随着网络技术与信息化技术发展迅猛,国家基于科技强警的观念对社区警务信息管理工 程越来越重视。因此,X 市公安局决定建立警务系统,通过信息技术实现各社区警务工作的 统一管理。为实现该系统,请完成以下任务。
任务一:实现出警顺序关键算法并绘制流程图(30 分) 有一个整型偶数 n(2<= n <=10000)代表警员总数,你要做的是:先把 1 到 n 中的所有奇 数从小到大输出,再把所有的偶数从小到大输出, 该顺序即为出警顺序。 注意:奇数和偶数的输出各占一行,每个数字后面跟随一个空格。
import java.util.List; import java.util.Scanner; /* *有一个整型偶数 n(2<= n <=10000)代表警员总数, *把1 到 n 中的 *所有奇数从小到大输出 *所有的偶数从小到大输出 *奇数和偶数的输出各占一行,每个数字后面跟随一个空格 */ public class Task1 { public static void main(String[] args) { System.out.println("奇数:"); int n = 10000; for(int i=0;i<n;i++){ if(i%2!=0){ if (i<n-1) System.out.print(i+"\t"); else System.out.print(i); } } System.out.println(); System.out.println("偶数:"); for(int i=0;i<n;i++){ if(i%2==0){ if (i<n-1) System.out.print(i+"\t"); else System.out.print(i); } } } }
任务二:实现点名计数关键算法并绘制流程图(30 分) 相传韩信才智过人,从不直接清点自己军队的人数,只要让士兵先后以三人一排、五人 一排、七人一排地变换队形,而他每次只看一眼队伍的排尾就知道总人数了。输入 3 个非负 整数 a,b,c ,表示每种队形排尾的人数(a<3,b<5,c<7),输出总人数的最小值(或报告无 解)。已知总人数不小于 10,不超过 100 。 例如:输入 1 2 3 输出 52。 注意:使用循环完成。
import java.util.Scanner; /* 以三人一排五人一排七人一排 3个非负整数 a,b,c ,表示每种队形排尾的人数(a<3,b<5,c<7) 输出总人数的最小值 总人数不小于 10,不超过 100 * */ public class Task2 { public static void main(String[] args) { Scanner s = new Scanner(System.in); System.out.print("输入:"); int a = s.nextInt(); int b = s.nextInt(); int c = s.nextInt(); System.out.print("输出:"); for (int i = 10; i <= 100; i++) { if (i%3==a && i%5==b && i%7==c && a<3 && b<5 && c<7) { System.out.print(i); } } } }
任务三:实现编号求部门关键算法并绘制流程图(30 分) 现在给你一个整数 N(2<N<1000),代表警员的编号,现在要求你写出一个程序,求出 从 1~N 个数中的所有素数的和,该和为警员对应部门的编号。 例如输入:3 输出 1~3 的素数{2,3}的和:5 注意:使用循环结构完成,你需要定义一个 isPrime 方法用于判断一个数是否是素数。
(2)作品提交要求见本模块附录 1 (3)实施条件要求见本模块附录 2 (4)评价标准见本模块附录 3
import java.util.Scanner; /* *素数除了1和它本身,不能被其它数整除 *求出从 1~N 个数中的所有素数的和 */ public class Task3 { public static void main(String[] args) { int n = 1000; System.out.print("输入:"); Scanner s = new Scanner(System.in); int j = s.nextInt(); int emps = 0; System.out.print("输出:{"); for (int i = 2; i <= j; i++) { if (isPrime(i)) {//是素数 emps = emps + i; } if (i<j) { System.out.print(i+","); } else { System.out.print(i); } } System.out.print("}和:"+emps); } public static boolean isPrime(int num) { boolean flag = false; for (int j = 2 ; j <= num; j++) {//1不是素数,直接从2开始 if (num%j == 0) { flag = true; return flag; } } return flag; } }
23.试题编号:J1-23《“生活繁琐”计算系统》关键算法
(1)任务描述 随着我国经济的发展,社会的进步,交易额每天都在不断上升,所以在我们生活中的各种 计算问题不断显现出来,例如税收、比赛评分等问题的计算,当数据多了难免会出问题,所 以开发出一套这种系统存在着一定的意义。
任务一:实现评分计算功能关键算法并绘制流程图(30 分)
编写一个应用程序,计算并输出一维数组(9.8,12,45,67,23,1.98,2.55,45) 中的最大值、最小值和平均值。
import java.util.Arrays; /* 计算并输出一维数组(9.8,12,45,67,23,1.98,2.55,45) 中的最大值、最小值和平均值。 */ public class Task1 { public static void main(String[] args) { double[] a = {9.8,12,45,67,23,1.98,2.55,45}; double max = 0; double min = 0; double num = 0; double average = 0; double s; for (int i = 0; i < a.length; i++) { s = a[i]; if (max<s) { max = s; } if (max > s) { min = s; max = min; } num = num + s; average = num/a.length; } System.out.print("最大值:"+max+"\r"); System.out.print("最小值:"+min+"\r"); System.out.print("平均值:"+average); } }
任务二:实现规律数字计算关键算法并绘制流程图(30 分) 计算算式 1+21+22+23+…+2n 的值。 注意:n 由键盘输入,且 2 ≤ n ≤10。
import java.util.Scanner; /* 计算算式 1+21+22+23+…+2n 的值 n由键盘输入,且 2 ≤ n ≤10 */ public class Task2 { public static void main(String[] args) { Scanner s = new Scanner(System.in); System.out.print("输入:"); int n = s.nextInt(); int num = 0; for (int i = 0; i < n; i++) { num = num + (21+i); } System.out.print(num+1); } }
任务三:实现个人交税计算功能关键算法并绘制流程图(30 分) 某国的个人所得税草案规定,个税的起征点为 3000 元,分成 7 级,税率情况见下表, 从键盘上输入月工资,计算应交纳的个人所得税。 表 1.6.1 税率情况表
注意:超出部分按所在税的级数计算,如:一个人的月收入为 6000,应交个人所得税 为:1500*0.05 +((6000-3000)-1500)*0.1=225 请在键盘上输入一个人的月收入,编程实现计算该公民所要交的税。 例如:输入“6000”,则输出“你要交的税为:225”。 (2)作品提交要求见本模块附录 1 (3)实施条件要求见本模块附录 2 (4)评价标准见本模块附录 3
import java.util.Scanner; /* *交税 */ public class Task3 { public static void main(String[] args) { Scanner s = new Scanner(System.in); System.out.print("输入:"); double salary = s.nextDouble(); double tax = 0;//税额 double tax1 = 0; if (salary<3000) { System.out.print("个税的起征点为 3000 元"); } else { tax1 = 1500 * 0.05; if((salary-1500) <= 4500){ tax = tax1 +(salary-1500)*0.1; } if ((salary-1500) <= 9000 && (salary-1500) > 4500) { tax = tax1 +(salary-1500)*0.2; } if ((salary-1500) <= 35000 && (salary-1500) > 9000) { tax = tax1 +(salary-1500)*0.25; } if ((salary-1500) <= 55000 && (salary-1500) > 35000) { tax = tax1 +(salary-1500)*0.3; } if ((salary-1500) <= 80000 && (salary-1500) > 55000) { tax = tax1 +(salary-1500)*0.35; } if ((salary-1500) > 80000) { tax = tax1 +(salary-1500)*0.45; } } System.out.print(tax); } }
24.试题编号:J1-24《软件协会纳新题库系统》关键算法
(1)任务描述 随着学院的不断发展与壮大,院校中各个协会的纳新人数也在不断的增长与扩大,然而 协会的发展并不是人数越多越多好,当然还要保证‘质量’过关,所以,每个协会的测量标 准都不相同,其中软件协会的纳新就是做软件习题,所以软件协会就开发出一套题库系统, 来从题库中抽取题目。
任务一:实现最大出现次数统计的关键算法并绘制流程图(30 分) 编写一个程序,对用户输入的任意一组字符如{3,1,4,7,2,1,1,2,2},输出其 中出现次数最多的字符,并显示其出现次数。如果有多个字符 出现次数均为最大且相等, 则输出最先出现的那个字符和它出现的次数。例如,上面输入的字符集合中,“1”和“2” 都出现了 3 次,均为最大出现次数,因为“1”先出现,则输出字符“1”和它出现的次数 3 次。 注意:使用分支、循环结构语句实现。
import java.util.Arrays; import java.util.HashSet; import java.util.Scanner; /* */ public class Task1 { public static void main(String[] args) { System.out.print("输入一组字符串:"); Scanner s = new Scanner(System.in); String n = s.nextLine(); int[] ns = new int[n.length()]; int count; for (int i = 0; i < n.length(); i++) { char sig = n.charAt(i);//将输入的字符串拆分单个字符 int num = Integer.parseInt(sig+""); ns[i] = num; } //System.out.print(Arrays.toString(ns)+"\r"); HashSet<Integer> has = new HashSet<Integer>(); for (Integer a : ns) { if (!has.add(a)){ System.out.print("重复字符:"+a+"\r"); } } //System.out.print(has); count = (ns.length) - (has.size()); System.out.print("重复次数:"+count+"\r"); } }
任务二:实现求平方根关键算法并绘制流程图(30 分) 求 n 以内(不包括 n)同时能被 3 和 7 整除的所有自然数之和的平方根 s,然后将结果 s 输出。例如若 n 为 1000 时,则 s=153.909064。 注意:使用循环语句结构实现。 ②n 由键盘输入,且 100 ≤ n ≤10000。
import java.util.Scanner; /* n以内(不包括 n)同时能被 3 和 7 整除的所有自然数之和的平方根 s */ public class Task2 { public static void main(String[] args) { System.out.print("输入n:"); Scanner s = new Scanner(System.in); int n = s.nextInt(); double emp = 0; double ss = 0; while (n>=100 && n<=10000) { for (int i = 0; i < n; i++) { if (i%3==0 && i%7==0) { emp += i; } } ss = Math.sqrt(emp); System.out.format("%.6f", ss).println(); return; } System.out.print("不在范围"); } }
任务三:实现求两数之间关系的关键算法并绘制流程图(30 分)
输入整数 a,输出结果 s,其中 s 与 a 的关系是:s=a+aa+aaa+aaaa+aa...a,最后为 a 个 a。例如 a=2 时,s=2+22=24。 注意:①使用循环结构语句实现。②a 由键盘输入,且 2 ≤ a ≤9。 (2)作品提交要求见本模块附录 1 (3)实施条件要求见本模块附录 2 (4)评价标准见本模块附录 3
import java.util.Scanner; /* *:s=a+aa+aaa+aaaa+aa...a *为 a个 a,例如 a=2 时,s=2+22=24 */ public class Task3 { public static void main(String[] args) { Scanner s = new Scanner(System.in); System.out.print("输入a:"); int a = s.nextInt(); while (a>=2 && a<=9) { System.out.println(fun(a)); return; } System.out.print("不在范围!"); } public static int fun(int a) { int result = 0;//方便num的累加,每循环一次num会改变 int num = a;//num接收每次循环后a变化的值 for (int i = 1; i <= a; i++) {//次数从1开始到a结束 if (i>1) { num = num*10 + a; } //第一次数是a result = result + num; } return result; } }
25.试题编号:J1-25《网上训练平台》关键算法
(1)任务描述 某学校软件技术专业的老师为训练学生编程逻辑和编程思维,决定开发一个网上训练平 台,供学生课后进行编程训练。学生可以使用系统提交程序并由系统对程序的正确性进行判 定。为实现该系统,需要提供大量的练习题及对应的程序。请完成以下的任务。
任务一:实现小球反弹问题关键算法并绘制流程图(30 分) 一个球从 100 米高度自由落下,每次落地后反弹回原高度的一半,再落下,再反弹。求 它在第十次落地时,共经过多少米?第十次反弹多高? 注意:使用循环结构语句实现。
/* 小球反弹 i为反弹次数 */ public class Task1 { public static void main(String[] args) { int h = 100; double hi = 0; double s = 0; for (int i = 1; i <= 10 ; i++) { hi = h/(2*i); s = s+hi; } System.out.print("经过"+s+"米\r"); System.out.print("反弹第十次的高度:"+hi); } }
任务二:实现停电停多久问题关键算法并绘制流程图(30 分) Lee 的老家住在工业区,日耗电量非常大。 今年 7 月,传来了不幸的消息,政府要在 7、8 月对该区进行拉闸限电。政府决定从 7 月 1 日起停电,然后隔一天到 7 月 3 日再停电,再隔两天到 7 月 6 日停电,依次下去,每次 都比上一次长一天。 Lee 想知道自己到家后到底要经历多少天倒霉的停电。请编写程序帮他算一算。 注意:从键盘输入放假日期、开学日期,日期限定在 7、8 月份,且开学日期大于放假 日期,然后在屏幕上输出停电天数。 提示:可以用数组标记停电的日期。
import java.util.Arrays; import java.util.Scanner; /* 先算出2个月停电的天数,再算出回家时已过天数中停电的天数,再相减得到的是在家剩下停电的天数 */ public class Task2 { public static void main(String[] args) { Scanner s = new Scanner(System.in); int month = s.nextInt(); int day = s.nextInt(); System.out.print(getDayNum(month, day)); } public static int getDayNum(int month,int day) { int n = 1,s1 = 1; int m = 1,s2 = 1; //7,8两个月共需停电的天数n,规律第一天开始停电,后面停电天数比前一天多一天(1,2,3...),2个月停电天数就是(2,4,6...) while (s1<=62) { s1 = s1 + n; n++; } System.out.print("7,8两个月共需停电的天数:"+n+"\r"); //回到家时已过天数中停电的天数,月份只能输入7,8月 while (s2<=(month-7)*31+day) { s2 = s2 + m; m++; } System.out.print("回到家时已过天数中停电的天数:"+m+"\r"); //在家剩下停电的天数 return n-m; } }
任务三:实现筛选奇数问题关键算法并绘制流程图(30 分) 编写程序实现:从键盘输入正整数 s,从低位开始取出 s 中的奇数位上的数,依次构成 一个新数 t,高位仍放在高位,低位仍放在低位,最后在屏幕上输出 t。例如,当 s 中的数 为 7654321 时,t 中的数为 7531。 注意:使用循环结构语句实现。 (2)作品提交要求见本模块附录 1 (3)实施条件要求见本模块附录 2 (4)评价标准见本模块附录 3
import java.util.ArrayList; import java.util.Arrays; import java.util.Collections; import java.util.Scanner; /* * */ public class Task3 { public static void main(String[] args) { Scanner s = new Scanner(System.in); System.out.print("输入整数a:"); String a = s.nextLine(); int[] as = new int[a.length()]; for (int i = 0; i < a.length(); i++) { char sig = a.charAt(i);//将输入的字符串拆分单个字符 as[i] = Integer.parseInt(sig+"");//将单个字符转化为字符串后再转化为int类型放入数组 } System.out.print("排序前"+Arrays.toString(as)+"\r"); //将数组排序,从高到低 int temp = 0; for (int i = 0; i < as.length; i++) { for (int k = 0; k < as.length-i-1; k++) { if (as[k]<as[k+1]) {//如果第一个数小于第2个数,往后移 temp = as[k]; as[k] = as[k+1];//后面的数放到前面的数去 as[k+1] = temp;//将前面的数位置让出来后再存入temp } } } System.out.print("排序后"+Arrays.toString(as)+"\r"); //取奇数位上的数放入aList ArrayList<Integer> aList = new ArrayList<Integer>(); for (int i = 0; i < as.length; i++) { char oddsig = a.charAt(i); int oddInt = Integer.parseInt(oddsig+""); if (oddInt%2!=0) {//获得奇数位上的数值 aList.add(oddInt); } } System.out.print(aList+"\r"); Collections.sort(aList);//从小到大 Collections.reverse(aList);//反过来 for (int i = 0; i < aList.size(); i++) { System.out.print(aList.get(i)); } } }