欢迎来到我的博客园

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

  

posted @ 2018-09-19 12:08  等待の喵  阅读(4897)  评论(7编辑  收藏