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




猜你喜欢

转载自blog.csdn.net/youcheng_ge/article/details/130305068
今日推荐