这是Java经典编程题系列最后一部分,把这些题目和解法了然于胸后能对我们的编程思维有一个显著的提升!
加油!在编程的道路上我们将越走越远。
二十一题:
求 1+2!+3!+…+20!的和
参考答案
public class Test21 {
public static void main(String[] args) {
long sum = 0;
long temp = 1;// 必须要设置为long类型,不然超过范围;
for (int i = 1; i <= 20; i++) {
temp = 1;
for (int j = 1; j <= i; j++) {
temp *= j;
}
sum += temp;
}
System.out.println(sum);
}
}
二十二题:
利用递归求5!
参考答案
public class Test22 {
public static void main(String[] args) {
System.out.println("5的阶乘为:" + fac(4));
}
public static int fac(int n) {
int k;
if (n == 0 || n == 1) {
k = 1;
} else {
k = n * fac(n - 1); // 当n>1时,调用自身计算(n-1)!
}
return k;
}
}
二十三题:
有 5 个人坐在一起,问第五个人多少岁?他说比第 4 个人大 2 岁。问第 4 个人岁数,他说比第 3 个人大 2 岁。问第三个人,又说比第 2 人大两岁。问第 2 个人,说比第一个人大两岁。最后问第一个人,他说是 10 岁。请问第五个人多大?
参考答案
public class Test23 {
public static void main(String[] args) {
int age = 10;// 第一个人的年龄
for (int i = 1; i <= 4; i++) {
age += 2; // 每次循环加两岁
System.out.println("第" + (i + 1) + "个人的年龄为:" + age);
}
}
}
二十四题
给一个不多于 5 位的正整数, 要求: 一、 求它是几位数, 二、 逆序打印出各位数字。
参考答案
public class Test24 {
public static Scanner input = new Scanner(System.in);
public static void main(String[] args) {
System.out.println("请输入一个不多于五位数的数字:");
Integer num = input.nextInt();// 定义Integer类型变量,便于转换成数组;
String numString = Integer.toString(num);// 利用Integer的方法转换成字符串;
char[] arrChar = numString.toCharArray();// 利用字符串的方法转换成字符数组,便于求长度和输出
System.out.println("您输入的是" + arrChar.length + "位数");
for (int i = 0; i < arrChar.length; i++) {
System.out.println("第" + (i + 1) + "个数字是" + arrChar[i]);
}
System.out.println("逆序打印:");
for (int i = arrChar.length - 1; i >= 0; i--) {
System.out.print(arrChar[i]);
}
}
}
二十五题
一个 5 位数,判断它是不是回文数。即 12321 是回文数,个位与万位相同,十位与千位相同。
参考答案
import java.util.Scanner;
public class Test25 {
public static Scanner input = new Scanner(System.in);
public static void main(String[] args) {
int k, x = 0;
System.out.println("请输入一个五位数:");
String snum = input.nextLine();
char[] cnum = snum.toCharArray(); // 转化为数组
for (int i = 0; i < cnum.length; i++) {
k = cnum.length - i - 1;
if (cnum[i] == cnum[k]) {
x++; // 记录相等数的个数
if (x >= 2) { // 5位数中前两位相等
System.out.println("这是一个回文数");
break;
}
continue;
} else {
break;
}
}
System.out.println("这不是一个回文数");
}
}
二十六题
请输入星期几的第一个字母来判断一下是星期几,如果第一个字母一样,则继续 判断第二个字母。
参考答案
import java.util.Scanner;
//请输入星期几的第一个字母来判断一下是星期几,如果第一个字母一样,则继续 判断第二个字母。
public class Test26 {
public static Scanner input = new Scanner(System.in);
public static void main(String[] args) {
String firstc; //第一个字母
String secondc; //第二个字母
System.out.println("请输入第一个字母:");
firstc = input.nextLine();
switch (firstc) {
case "M":
System.out.println("星期一:Monday(Mon.)");
break;
case "T":
System.out.println("请输入第二个字母:");
secondc = input.nextLine();
if (secondc == "u") {
System.out.println("星期二:Tuesday(Tues.)");
break;
} else {
System.out.println("星期四:Thursday(Thur./Thurs.)");
break;
}
case "W":
System.out.println("星期三:Wednesday(Wed.)");
break;
case "F":
System.out.println("星期五:Friday(Fri.)");
break;
case "S":
System.out.println("请输入第二个字母:");
secondc = input.nextLine();
if (secondc == "a") {
System.out.println("星期六:Saturday(Sat.)");
break;
} else {
System.out.println("星期日:Sunday(Sun.)");
break;
}
default:
System.out.println("无此写法");
}
}
}
二十七题
求 100 之内的素数
参考答案
public class Test27 {
public static void main(String[] args) {
int i,j,k=0,h=0;//k用来判断被整除数的个数,h用来控制1行输出的数字个数
for(i=2;i<101;i++) {//查找2至100的素数
for(j=1;j<=i;j++) {
if(i%j==0) {
k++;
}
}
if(k==2) {//2代表i为素数
System.out.print(i+" ");
h++;
if(h==5) {//5个数字后换行
System.out.println();
h=0;//重置h
}
}
k=0;
}
}
}
二十八题
对 10 个数进行排序
参考答案
import java.util.Arrays;
//对 10 个数进行排序
public class Test28 {
public static void main(String[] args) {
int t;
int[] num = { 1, 5, 2, 3, 6, 4, 8, 7, 9, 0 };
System.out.println("排序之前:");
for (int i = 0; i < num.length; i++) {
System.out.print(num[i] + " ");
}
// 冒泡排序(降序排序)
for (int i = 0; i < num.length; i++) {
for (int j = 0; j < num.length - 1 - i; j++) { // 内循环
if (num[j] < num[j + 1]) { // 如果前面的数比后面的数小
// 大小交换
t = num[j];
num[j] = num[j + 1];
num[j + 1] = t;
}
}
}
/**
* 逆天方法Arrays.sort();直接把数组放进去自动帮我们排序(爽),但只能升序……
*/
// Arrays.sort(num);
System.out.println("\n排序之后:");
for (int i = 0; i < num.length; i++) {
System.out.print(num[i] + " ");
}
}
}
二十九题
求一个 3*3 矩阵对角线元素之和
参考答案
import java.util.Scanner;
public class Test29 {
public static Scanner input = new Scanner(System.in);
public static void main(String[] args) {
int i, j, k = 0;
int sum; // 存储计算数据
int a[][] = new int[3][3]; // 二维数组存储矩阵
System.out.println("请输入3*3的矩阵:");
for (i = 0; i < 3; i++) {
for (j = 0; j < 3; j++) {
a[i][j] = input.nextInt();
}
}
System.out.println("3*3矩阵为:");
for (i = 0; i < 3; i++) {
for (j = 0; j < 3; j++) {
System.out.print(a[i][j] + " ");
k++;
if (k == 3) { // 每输出3个数字换1行
System.out.println();
k = 0; // 换行后重新计数
}
}
}
sum = (a[0][0] + a[1][1] + a[2][2]) + (a[0][2] + a[1][1] + a[2][0]); // 计算3*3矩阵对角线之和
System.out.println("3*3矩阵对角线之和为:" + sum);
}
}
三十题:
有一个已经排好序的数组。现输入一个数,要求按原来的规律将它插入数组中。
参考答案
import java.util.Scanner;
public class Test30 {
public static Scanner input = new Scanner(System.in);
public static void main(String[] args) {
int[] a = new int[] { 1, 2, 6, 14, 25, 36, 37, 56 };
int[] b = new int[a.length + 1];
int i = 0;
System.out.print("请输入一个整数:");
int num = input.nextInt();
if (num >= a[a.length - 1]) {// 如果大于最大数,直接加在最后
b[b.length - 1] = num;
for (i = 0; i < a.length; i++) {// 把a数组复制给b数组
b[i] = a[i];
}
} else {// 如果不大于最大数
for (i = 0; i < a.length; i++) {
if (num >= a[i]) {// 如果次数大于当前的数
b[i] = a[i];// 加在b对应的的位置
} else {
b[i] = num;
break;
}
}
for (int j = i + 1; j < b.length; j++) {// a中的i后边元素都在b中往后移一个位置
b[j] = a[j - 1];
}
}
for (i = 0; i < b.length; i++) {// 输出数组
System.out.print(b[i] + " ");
}
}
}
三十一题
将一个数组逆序输出
参考答案
public class Test31 {
public static void main(String[] args) {
int i;
int a[] = { 1, 2, 3, 4, 5, 6, 7, 8, 9 };
System.out.println("正常顺序:");
for (i = 0; i < a.length; i++) {
System.out.print(a[i] + " ");
}
System.out.println();
i = a.length - 1; //获取最后一个数的下标
System.out.println("逆序输出:");
for (; i >= 0; i--) {
System.out.print(a[i] + " ");
}
}
}
三十二题
取一个整数 a 从右端开始的 4~7 位
参考答案
import java.util.Scanner;
public class Test32 {
public static Scanner input = new Scanner(System.in);
public static void main(String[] args) {
int[] arr = new int[100];// 初始化定义数组,默认长度为100;
System.out.println("请输入多个正整数(输入-1结束):");
int i = 0;// 定义i是为了知道数组中有多少个元素;
do// 用户do while循环是为了控制数组输入的结束;
{
arr[i] = input.nextInt();
i++;
} while (arr[i - 1] != -1);// 第一次到这里的时候,i已经是1,所以可以减去1
System.out.println("\n您输入的数组是:");
for (int j2 = 0; j2 < i - 1; j2++) {// 顺序输入刚才输入的数组
System.out.print(arr[j2] + " ");
}
System.out.println("您输入的数组逆序输出为:\n");
for (int j2 = 0; j2 < i - 1; j2++) {// 逆序输入刚才输入的数组
System.out.print(arr[i - 2 - j2] + " ");
}
}
}
三十三题:
打印出杨辉三角形(手动选择要打印的行数)
参考答案
import java.util.Scanner;
public class Test33 {
public static void main(String[] args) {
Scanner input = new Scanner(System.in);
System.out.println("请输入要显示的杨辉三角的行数:");
int num = input.nextInt();// 获得要显示的行数
int[][] arr = new int[num][num];// 定义二维数组,存储要显示的数字
for (int i = 0; i < arr.length; i++) {
arr[i][i] = 1;// 确定每行最后的数字
arr[i][0] = 1;// 确定每行开始的数字
}
for (int i = 2; i < arr.length; i++) {// 获取每一行的开始和结束的数字
for (int j = 1; j < i; j++) {
arr[i][j] = arr[i - 1][j - 1] + arr[i - 1][j];
}
}
for (int i = 0; i < arr.length; i++) {// 打印出二维数组
for (int j = 0; j < 2 * (arr.length - i) - 1; j++) {// 控制每一行的最前面显示的空格数
System.out.print(" ");
}
for (int j = 0; j <= i; j++) {// 打印出数组中的元素,并且以空格隔开
System.out.print(arr[i][j] + " ");
}
System.out.println();// 每次打印一行结束之后换行;
}
}
}
三十四题
输入 3 个数 a,b,c,按大小顺序输出
参考答案
import java.util.Scanner;
public class Test34 {
public static Scanner input = new Scanner(System.in);
public static void main(String[] args) {
int a, b, c;
System.out.println("请输入3个数(a,b,c):");
a = input.nextInt();
b = input.nextInt();
c = input.nextInt();
System.out.println("按大小输出为:");
if (a > b && a > c) { //三种情况排大小
if (b > c) {
System.out.println(a + " " + b + " " + c + " ");
} else {
System.out.println(a + " " + c + " " + b + "");
}
} else if (b > a && b > c) {
if (a > c) {
System.out.println(b + " " + a + " " + c + " ");
} else {
System.out.println(b + " " + c + " " + a + " ");
}
} else if (c > a && c > b) {
if (a > b) {
System.out.println(c + " " + a + " " + b + " ");
} else {
System.out.println(c + " " + b + " " + a + " ");
}
} else {
System.out.println("无法判断");
}
}
}
三十五题
输入数组, 最大的与第一个元素交换, 最小的与最后一个元素交换, 输出数组。
参考答案
import java.util.Scanner;
//输入数组, 最大的与第一个元素交换, 最小的与最后一个元素交换, 输出数组。
public class Test35 {
public static Scanner input = new Scanner(System.in);
public static void main(String[] args) {
int i;
int max, min;
int a = 0, b = 0, k;
System.out.println("您要输入几位数?");
k = input.nextInt();
int arr[] = new int[k];
System.out.println("请输入k个数:");
for (i = 0; i < k - 1; i++) {
arr[i] = input.nextInt();
}
// 默认最大值最小值为第一个数
max = arr[0];
min = arr[0];
for (i = 0; i <= k - 1; i++) {
if (arr[i] > max) {
max = arr[i]; // 记录最大值
a = i; // 记录最大值的下标
}
if (arr[i] < min) {
min = arr[i]; // 记录最小值
b = i; // 记录最小值下标
}
}
// 最大的与第一个元素交换, 最小的与最后一个元素交换
arr[a] = arr[0];
arr[0] = max;
arr[b] = arr[k - 1];
arr[k - 1] = min;
for (i = 0; i <= k - 1; i++) {
System.out.print(arr[i] + " ");
}
}
}
三十七题
有n个整数, 使其前面各数顺序向后移m个位置, 最后m个数变成最前面的m个数
参考答案
public class Test37 {
public static void main(String[] args) {
Scanner input = new Scanner(System.in);
System.out.println("请输入数组的长度:");// 定义数组长度
int num = input.nextInt();
int[] arr = new int[num];
System.out.println("请输入数组元素:");// 键入数组元素
for (int i = 0; i < num; i++) {
arr[i] = input.nextInt();
}
System.out.println("您输入的数组是:");// 打印数组
for (int j = 0; j < arr.length; j++) {
System.out.print(arr[j] + " ");
}
System.out.println("请输入移动的位数:");// 获取移动位数
int m = input.nextInt();
int[] arr2 = new int[num];
for (int k = 0; k < m; k++) {// 先把移动的转移进新数组
arr2[k] = arr[num - m + k];
}
for (int k2 = 0; k2 < num - m; k2++) {// 把向后移的插入到新数组
arr2[m + k2] = arr[k2];
}
System.out.println("移动后的数组为:");
for (int l = 0; l < arr2.length; l++) {
System.out.print(arr2[l]+" ");
}
}
}
三十八题
有 n 个人围成一圈,顺序排号。从第一个人开始报数(从 1 到 3 报数),凡报到 3的人退出圈子,问最后留下的是原来第几号的那位
参考答案
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
import java.util.Scanner;
//有 n 个人围成一圈,顺序排号。从第一个人开始报数(从 1 到 3 报数),凡报到 3的人退出圈子,问最后留下的是原来第几号?
import java.util.Scanner;
public class Test38 {
public static void main(String[] args) {
Scanner input = new Scanner(System.in);
System.out.println("请输入总人数:");//定义数组长度
int num = input.nextInt();
//定义数组,用其中的元素标记是否已经被淘汰,0表示为被淘汰
int [] arr = new int[num];
for (int i = 0; i < num; i++) {//初始化数组元素都是1
arr[i] = 1;
}
for (int i = 0; i < arr.length; i++) {
System.out.println(arr[i]);
}
int index = 0;
int sum = 0;
while(num > 1 )//用来控制剩余的人数
{
if (arr[index] == 1) {
sum++;
if (sum == 3) {//如果是3,则重新记,从1开始
sum = 0;
arr[index] = 0;
num-- ;
}
}
index++ ;
if (index == arr.length) {//如果索引是数组的长度,则从0开始
index = 0 ;
}
}
for (int i = 0; i < arr.length; i++) {
System.out.println(arr[i]);
}
for (int i = 0; i < arr.length; i++) {
if (arr[i] == 1) {
System.out.println("第"+(i+1)+"留了下来");
}
}
}
}
三十九题
写一个函数, 求一个字符串的长度, 在 main 函数中输入字符串, 并输出其长度。
参考答案
import java.util.Scanner;
public class Test39 {
public static Scanner sc=new Scanner(System.in);
public static void main(String[] args) {
System.out.println("请输入一个字符串:");
String str=sc.nextLine();
char[] ch=str.toCharArray();
int k=ch.length;
System.out.println(str+"的长度为:"+k);
}
}
四十题
编写一个函数,输入 n 为偶数时,调用函数求 1/2+1/4+…+1/n,当输入 n 为奇数时,调用函数 1/1+1/3+…+1/n
参考答案
import java.util.Scanner;
public class Test40 {
public static void main(String[] args) {
Scanner s = new Scanner(System.in);
System.out.print("请输入一个正整数 n= ");
int n = s.nextInt();
System.out.println("相应数列的和为:" + sum(n));
}
public static double sum(int n) {
double res = 0;
if (n % 2 == 0) {
for (int i = 2; i <= n; i += 2) {
res += (double) 1 / i;
}
} else {
for (int i = 1; i <= n; i += 2) {
res += (double) 1 / i;
}
}
return res;
}
}
路漫漫其修远兮,能看完的同伴们一定都是胸怀大志之人,我很看好你们哦,加油!