系列文章
【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
文章目录
- 系列文章
- 前言
- 一、题目
- 1.1 【程序1】
- 1.2 【程序2】
- 1.3 【程序3】
- 1.4 【程序4】
- 1.5 【程序5】
- 1.6 【程序6】
- 1.7 【程序7】
- 1.8 【程序8】
- 1.9 【程序9】
- 1.10 【程序10】
- 二、答案
- 2.1 【程序1】
- 2.2 【程序2】
- 2.3 【程序3】
- 2.4 【程序4】
- 2.5 【程序5】
- 2.6 【程序6】
- 2.7 【程序7】
- 2.8 【程序8】
- 2.9 【程序9】
- 2.10 【程序10】
前言
我能抽象出整个世界,但是我不能抽象你。 想让你成为私有常量,这样外部函数就无法访问你。 又想让你成为全局常量,这样在我的整个生命周期都可以调用你。 可惜世上没有这样的常量,我也无法定义你,因为你在我心中是那么的具体。
哈喽大家好,本专栏为【项目实战】专栏,有别于【底层库】专栏,我们可以发现增加 了『问题描述』、『项目展示』章节,十分符合项目开发流程,让读者更加清楚项目解决的问题、以及产品能够达到的效果。本专栏收纳项目开发过程的解决方案,是我项目开发相对成熟、可靠方法的提炼,我将这些问题的解决思路梳理,撰写本文分享给大家,大家遇到类似问题,可按本文方案处理。
本专栏会持续更新,不断完善,专栏文章关联性较弱(文章之间依赖性较弱,没有阅读顺序)。大家有任何问题,可以私信我。如果您对本专栏感兴趣,欢迎关注吧,我将带你用最简洁的代码,实现复杂的功能。
【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】
题目:有一个已经排好序的数组。现输入一个数,要求按原来的规律将它插入数组中。
- 程序分析:首先判断此数是否大于最后一个数,然后再考虑插入中间的数的情况,插入后此元素之后的数,依次后移一个位置。
二、答案
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();
}
}