【Java】『蓝桥杯』10道编程题及答案(三)

系列文章

【Java】『蓝桥杯』10道编程题及答案(一)
本文链接:https://blog.csdn.net/youcheng_ge/article/details/130223115

【Java】『蓝桥杯』10道编程题及答案(二)
本文链接:https://blog.csdn.net/youcheng_ge/article/details/130304773

【Java】『蓝桥杯』10道编程题及答案(三)
本文链接:https://blog.csdn.net/youcheng_ge/article/details/130305068

【Java】『蓝桥杯』10道编程题及答案(四)
本文链接:https://blog.csdn.net/youcheng_ge/article/details/130392388

【Java】『蓝桥杯』10道编程题及答案(五)
本文链接:https://blog.csdn.net/youcheng_ge/article/details/130444113



前言

我能抽象出整个世界,但是我不能抽象你。 想让你成为私有常量,这样外部函数就无法访问你。 又想让你成为全局常量,这样在我的整个生命周期都可以调用你。 可惜世上没有这样的常量,我也无法定义你,因为你在我心中是那么的具体。

哈喽大家好,本专栏为【Java】专栏,『蓝桥杯』部分,面向于初学者或者对算法感兴趣的朋友们。主要分享基础编程题,一些有趣、新颖的算法,我们要习惯于掌握解题的思路,如果对实操感兴趣,可以关注我的【C#项目】专栏。

本专栏会持续更新,不断完善。大家有任何问题,可以私信我。如果您对本专栏感兴趣,欢迎关注吧,大家一起学习,一起进步。

【Java】『蓝桥杯』10道编程题及答案(三)
在这里插入图片描述


一、题目

1.1 【程序1】

【程序21】
题目:求1+2!+3!+…+20!的和
1.程序分析:此程序只是把累加变成了累乘。

1.2 【程序2】

【程序22】
题目:利用递归方法求5!。
1.程序分析:递归公式:fn=fn_1*4!

1.3 【程序3】

【程序23】
题目:有5个人坐在一起,问第五个人多少岁?他说比第4个人大2岁。问第4个人岁数,他说比第3个人大2岁。问第三个人,又说比第2人大两岁。问第2个人,说比第一个人大两岁。最后问第一个人,他说是10岁。请问第五个人多大?
1.程序分析:利用递归的方法,递归分为回推和递推两个阶段。要想知道第五个人岁数,需知道第四人的岁数,依次类推,推到第一人(10岁),再往回推。

1.4 【程序4】

【程序24】
题目:给一个不多于5位的正整数,要求:一、求它是几位数,二、逆序打印出各位数字。

1.5 【程序5】

【程序25】 题目:一个5位数,判断它是不是回文数。即12321是回文数,个位与万位相同,十位与千位相同。

1.6 【程序6】

【程序26】
题目:请输入星期几的第一个字母来判断一下是星期几,如果第一个字母一样,则继续 判断第二个字母。
1.程序分析:用情况语句比较好,如果第一个字母一样,则判断用情况语句或if语句判断第二个字母。

1.7 【程序7】

【程序27】
题目:求100之内的素数

1.8 【程序8】

【程序28】
题目:对10个数进行排序
1.程序分析:可以利用选择法,即从后9个比较过程中,选择一个最小的与第一个元素交换, 下次类推,即用第二个元素与后8个进行比较,并进行交换。

1.9 【程序9】

【程序29】
题目:求一个3*3矩阵对角线元素之和
1.程序分析:利用双重for循环控制输入二维数组,再将a[i][i]累加后输出。

1.10 【程序10】

【程序30】
题目:有一个已经排好序的数组。现输入一个数,要求按原来的规律将它插入数组中。

  1. 程序分析:首先判断此数是否大于最后一个数,然后再考虑插入中间的数的情况,插入后此元素之后的数,依次后移一个位置。


二、答案

2.1 【程序1】

public class FactorialAddSum {

	/**
	 * 【程序21】 题目:求1+2!+3!+...+20!的和 1.程序分析:此程序只是把累加变成了累乘。
	 */
	public static void main(String[] args) {
		// TODO Auto-generated method stub
		long t = 1;
		long sum = 1;
		String s = "1!";
		for (int i = 2; i < 21; i++) {
			t *= i;
			sum += t;
			s += " + " + i + "!";
		}

		System.out.println(s + " = " + sum);
	}

}



2.2 【程序2】

import java.util.Scanner;

public class FactorialRecursive {

	/**
	 * @param args
	 */
	public static void main(String[] args) {
		// TODO Auto-generated method stub
		Scanner sc = new Scanner(System.in);
		int n;
		while (true) {
			System.out.println("请输入一个非负整数:");
			if (0 <= (n = sc.nextInt()))
				break;
		}

		System.out.println(n + "! = " + factorial(n));
	}

	private static long factorial(int n) {
		if (n == 0) {
			return 1l;
		} else {
			return factorial(n - 1) * n;
		}
	}
}




2.3 【程序3】

public class CalcAge {

	/**
	 * 【程序23】
	 * 题目:有5个人坐在一起,问第五个人多少岁?他说比第4个人大2岁。问第4个人岁数,他说比第3个人大2岁。问第三个人,又说比第2人大两岁。
	 * 问第2个人,说比第一个人大两岁。最后问第一个人,他说是10岁。请问第五个人多大?
	 * 1.程序分析:利用递归的方法,递归分为回推和递推两个阶段。要想知道第五个人岁数,需知道第四人的岁数,依次类推,推到第一人(10岁),再往回推。
	 */
	public static void main(String[] args) {
		// TODO Auto-generated method stub
		System.out.println("第五个人的年龄是:" + calcAge(5));
	}

	private static int calcAge(int n) {
		if (n == 1)
			return 10;
		else
			return calcAge(n - 1) + 2;
	}
}


2.4 【程序4】

import java.util.Scanner;

public class OfNumbersReverse {

	/**
	 * 【程序24】 题目:给一个不多于5位的正整数,要求:一、求它是几位数,二、逆序打印出各位数字。
	 */
	public static void main(String[] args) {
		// TODO Auto-generated method stub
		Scanner sc = new Scanner(System.in);
		long n;
		while (true) {
			System.out.println("请输入一个不多于5位的正整数:");
			n = sc.nextLong();
			if (n > 0 && n < 100000)
				break;
		}
		String s = "" + n;
		System.out.println(s + "是" + s.length() + "位数;\n其反序输出结果为:");
		for (int i = s.length(); i > 0; i--) {
			System.out.print(s.charAt(i - 1));
		}
	}
}


2.5 【程序5】

public class ReturnText {
	/**
	 * 【程序25】 题目:一个5位数,判断它是不是回文数。即12321是回文数,个位与万位相同,十位与千位相同。
	 */
	public static void main(String[] args) {
		// TODO Auto-generated method stub
		int ct = 0;
		for (int i = 10000; i < 100000; i++) {
			if (isReturnText("" + i)) {
				System.out.println(i);
				ct++;
			}
		}
		System.out.println("在10000~99999之间共有:" + ct + "个回文数。");
	}

	private static boolean isReturnText(String s) {
		char[] ch = s.toCharArray();
		if (ch[0] == ch[4] && ch[1] == ch[3]) {
			return true;
		} else {
			return false;
		}
	}
}


2.6 【程序6】

import java.util.ArrayList;
import java.util.List;
import java.util.Scanner;

public class FindWeek {

	/**
	 * 【程序26】 题目:请输入星期几的第一个字母来判断一下是星期几,如果第一个字母一样,则继续 判断第二个字母。
	 * 1.程序分析:用情况语句比较好,如果第一个字母一样,则判断用情况语句或if语句判断第二个字母。
	 */
	public static void main(String[] args) {
		// TODO Auto-generated method stub
		Week[] week = Week.values();
		List<Week> list = new ArrayList<Week>();
		List<Week> list2 = new ArrayList<Week>();
		char ch, ch2;
		Scanner sc = new Scanner(System.in);
		System.out.println("请输入第一个字符:");
		ch = Character.toUpperCase(sc.nextLine().charAt(0));
		for (int i = 0; i < 7; i++) {
			if (ch == week[i].toString().charAt(0)) {
				list.add(week[i]);
			}
		}
		switch (list.size()) {
		case 0:
			System.out.println("星期名称中没有以字母" + ch + "开头的。");
			break;
		case 1:
			System.out.println("以字母" + ch + "开头的周日期是:" + list.get(0) + ",即是:"
					+ list.get(0).toChString() + "。");
			break;
		default:
			System.out.println("请输入第二个字符:");
			ch2 = Character.toLowerCase(sc.nextLine().charAt(0));
			for (int i = 0; i < list.size(); i++) {
				if (ch2 == list.get(i).toString().charAt(1)) {
					list2.add(list.get(i));
				}
			}
			if (list2.size() == 1) {
				System.out.println("以" + ch + ch2 + "开头的周日期是:" + list2.get(0)
						+ ",即是:" + list2.get(0).toChString() + "。");
			} else {
				System.out.println("星期名称中没有以" + ch + ch2 + "开头的。");
			}
		}
	}

}

enum Week {
	Sunday, Monday, Tuesday, Wednesday, Thursday, Friday, Saturday;

	public String toChString() {
		String str = "";
		switch (this.ordinal()) {
		case 0:
			str = "星期日";
			break;
		case 1:
			str = "星期一";
			break;
		case 2:
			str = "星期二";
			break;
		case 3:
			str = "星期三";
			break;
		case 4:
			str = "星期四";
			break;
		case 5:
			str = "星期五";
			break;
		case 6:
			str = "星期六";
			break;
		}
		return str;
	}
}

2.7 【程序7】

public class PrimeDown100 {

	/**
	 * 【程序27】 题目:求100之内的素数
	 */
	public static void main(String[] args) {
		// TODO Auto-generated method stub
		int ct = 0;
		for (int i = 2; i < 101; i++) {
			int j;
			for (j = 2; j < i; j++) {
				if (i % j == 0)
					break;
			}
			if (i == j) {
				ct++;
				System.out.println(i + "  ");
			}
		}
		System.out.println("2~100之间共有:" + ct + "个质数。");
	}

}


2.8 【程序8】

①方法一:

import java.lang.reflect.Array;
import java.util.Arrays;
import java.util.Scanner;

public class SortArray10_2 {

	/**
	 * 【程序28】 题目:对10个数进行排序 。 1、分析 使用Array及Arrays进行排序处理。
	 */
	public static void main(String[] args) {
		// TODO Auto-generated method stub
		float f[] = new float[10];
		System.out.println("请输入十个实数(中间可以用空格分开,也可以是回车,但不能够为其它字符,多则仅前十个有效):");
		Scanner sc = new Scanner(System.in);
		for (int i = 0; i < 10; i++) {
			f[i] = sc.nextFloat();
		}
		System.out.println("你输入的十个数分别为:");
		for (int i = 0; i < Array.getLength(f); i++) {
			System.out.print(Array.getFloat(f, i) + "  ");
		}
		Arrays.sort(f);
		System.out.println("\n你输入的十个数排序(从小到大)后为:");
		for (int i = 0; i < Array.getLength(f); i++) {
			System.out.print(Array.getFloat(f, i) + "  ");
		}
	}
}

②方法二:

import java.util.Scanner;

public class SortArray10 {

	/**
	 * 【程序28】 题目:对10个数进行排序 1.程序分析:可以利用选择法,即从后9个比较过程中,选择一个最小的与第一个元素交换,
	 * 下次类推,即用第二个元素与后8个进行比较,并进行交换。
	 */
	public static void main(String[] args) {
		// TODO Auto-generated method stub
		float[] f = new float[10];
		System.out.println("请输入十个实数(中间可以用空格分开,也可以是回车,但不能够为其它字符,多则仅前十个有效):");
		Scanner sc = new Scanner(System.in);
		for (int i = 0; i < 10; i++) {
			f[i] = sc.nextFloat();
		}
		System.out.println("你输入的十个数分别为:");
		output(f);

		float tmp;
		for (int i = 0; i < f.length - 1; i++) {
			for (int j = i + 1; j < f.length; j++) {
				if (f[i] > f[j]) {
					tmp = f[i];
					f[i] = f[j];
					f[j] = tmp;
				}
			}
		}
		System.out.println("你输入的十个数排序后(从小到大)为:");
		output(f);
	}

	private static void output(float[] f) {
		for (int i = 0; i < f.length; i++) {
			System.out.print(f[i] + "  ");
		}
		System.out.println();
	}
}

2.9 【程序9】

import java.util.Scanner;

public class DiagonalMatrix {

	/**
	 * 1、设M=(αij)为n阶方阵.M的两个下标相等的所有元素都叫做M的对角元素,而序列(αii)1≤i≤n叫做M的主对角线.
	 * 2、所有非主对角线元素全等于零的n阶矩阵,称为对角矩阵或称为对角方阵。
	 */
	// *【程序29】 题目:求一个3*3矩阵对角线元素之和
	// * 1.程序分析:利用双重for循环控制输入二维数组,再将a[i][i]累加后输出。
	public static void main(String[] args) {
		// TODO Auto-generated method stub
		int[][] a = new int[3][3];
		Scanner sc = new Scanner(System.in);
		String[] str = new String[3];
		int sum = 0;
		for (int i = 0; i < 3; i++) {
			str[i] = "";
			for (int j = 0; j < 3; j++) {
				String tmp = "";
				if (i == j) {
					System.out.println("请输入对角矩阵的第" + (i + 1) + "个对角上的数:");
					a[i][j] = sc.nextInt();
					sum += a[i][j];
				} else {
					a[i][j] = 0;
				}
				tmp += a[i][j] + "            ";
				str[i] += tmp.substring(0, 8);
			}
		}

		System.out.println("                                        这个对角矩阵的形式为:");
		for (int i = 0; i < 3; i++) {
			System.out.println("                " + str[i]);
		}
		System.out.println("这个对角矩阵的对角上线数值的和为:" + sum);
	}

}




2.10 【程序10】

①方法一:

import java.util.Scanner;

public class InsertNumberInOrderedArray {

	/**
	 * 【程序30】 题目:有一个已经排好序的数组。现输入一个数,要求按原来的规律将它插入数组中。 1.
	 * 程序分析:首先判断此数是否大于最后一个数,然后再考虑插入中间的数的情况,插入后此元素之后的数,依次后移一个位置。
	 */
	// 此程序实际上就是插入排序法,可以根据输入你要进行排序的
	// 数据个数,然后排序出来(是升序——从小到大排列的)。
	public static void main(String[] args) {
		// TODO Auto-generated method stub
		int[] a = new int[1];
		int[] b = new int[1];
		int k = 2;
		int tmp, tmp2;
		Scanner sc = new Scanner(System.in);
		while (true) {
			System.out.println("请输入一个大于1的整数:");
			tmp2 = sc.nextInt();
			if (tmp2 > 1)
				break;
		}
		System.out.println("请你再输入" + tmp2 + "个数(可用空格隔开,也可以打回车,多的将被去掉)");
		a[0] = sc.nextInt();
		while (k <= tmp2) {
			tmp = sc.nextInt();
			boolean f = false;
			b = new int[k];
			ShiftArrayElements(b, a);// 临时将数组a的内容存入数组b中
			int m;
			for (m = k - 2; m >= 0; m--) {
				if (tmp < b[m]) {
					b[m + 1] = b[m];
					f = true;
				} else {
					break;
				}
			}
			if (!f) {//如果在它本身最大,则放入最后一个元素中
				b[k - 1] = tmp;
			} else {
				b[m + 1] = tmp;//否则在中间或开头插入
			}
			a = new int[k++];
			ShiftArrayElements(a, b);// 临时将数组b的内容存入数组a中
		}

		System.out.println("============================\n这" + tmp2
				+ "个数从小到到的顺序如下:");
		for (int i = 0; i < a.length; i++) {
			System.out.print(a[i] + "  ");
		}
	}

	private static void ShiftArrayElements(int[] a, int[] b) {
		for (int i = 0; i < b.length; i++) {
			a[i] = b[i];
		}
	}
}

②方法二:

import java.util.Scanner;

public class InsertNumberInOrderedArray2 {

	/**
	 * 【程序30】 题目:有一个已经排好序的数组。现输入一个数,要求按原来的规律将它插入数组中。 1.
	 * 程序分析:首先判断此数是否大于最后一个数,然后再考虑插入中间的数的情况,插入后此元素之后的数,依次后移一个位置。
	 */
	public static void main(String[] args) {
		// TODO Auto-generated method stub
		int[] a = new int[8];
		int[] b = { 23, 45, 46, 78, 90, 102, 120 };
		for (int i = 0; i < b.length; i++) {
			a[i] = b[i];
		}
		Scanner sc = new Scanner(System.in);
		int d, i, k;
		boolean f = true;
		System.out.println("请输入一个数:");
		d = sc.nextInt();
		for (i = b.length - 1; i > -1; i--) {
			if (d < a[i]) {
				a[i + 1] = a[i];
				f = false;
			} else {
				break;
			}
		}
		if (f) {
			a[b.length] = d;
			k = b.length;
		} else {
			a[i + 1] = d;
			k = i + 1;
		}
		output("插入数据前,原来的有序数组为:", b, -1);
		output("插入数\"" + d + "\"后,得到的结果是:", a, k);
	}

	private static void output(String str, int[] a, int k) {
		System.out.println(str);//k为插入的数作标记,该数前后都加^
		for (int i = 0; i < a.length; i++) {
			if (k != -1 && k == i) {
				System.out.print("^" + a[i] + "^  ");
			} else {
				System.out.print(a[i] + "  ");
			}
		}
		System.out.println();
	}
}




  • 7
    点赞
  • 37
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 12
    评论
蓝桥杯是由中国青少年计算机学会主办的全国性计算机竞赛,旨在选拔和培养优秀的计算机人才。历年的蓝桥杯比赛题目涉及多个计算机领域,包括算法设计、编程语言、数据结构等。 针对历年蓝桥杯的真题和答案,针对Java编程语言的一些常见题型进行了总结。例如,经典的Java语法题目要求考生理解Java的基本语法规则,如变量声明、运算符和控制流程等。难度逐年加大,从简单的输出题目,逐渐演变为实现复杂的功能。 除了Java语法的题目之外,蓝桥杯还涉及到了算法和数据结构。其中,考生需要具备对常用算法和数据结构的理解与应用,如递归、排序算法、查找算法、树和图等。在这些题目中,考生需要分析问题,设计算法,并正确地使用Java语言进行编码实现。这不仅考察了考生对Java编程语言的熟悉程度,还考察了对解决问题的能力。 由于蓝桥杯是一项多学科综合性的计算机竞赛,除了Java编程语言的题目之外还有其他的竞赛题目。因此,考生需要全面地学习计算机相关知识,扎实掌握编程语言和算法基础,提高自己的综合素质。 总结而言,历年蓝桥杯的真题及答案涵盖了Java编程语言的各个方面,需要考生对Java语法、算法和数据结构等进行深入理解和应用。通过学习和解答这些题目,可以提高自己在计算机领域的能力和竞争力。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 12
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

花北城

你的鼓励是我最大的动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值