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));
}
}
}