Java经典算法(三)
说明:共有四十题。本部分为第三部分,共十题。
21、题目:求1+2!+3!+...+20!的和
package com.remoa.algorithm.day11;
/**
* 题目:求1+2!+3!+...+20!的和
* @author Remoa
*
*/
public class Factorial {
public static int algorithm(){
int sum = 0, temp = 1;
for(int i = 1; i <= 20; i++){
temp *= i;
sum += temp;
}
return sum;
}
public static void main(String[] args) {
System.out.println("和为:" + algorithm());
}
}
运行结果:
图21.1 求和运行结果
22、题目:利用递归方法求5!。
package com.remoa.algorithm.day11;
/**
* 题目:利用递归方法求5!。
* @author Remoa
*
*/
public class Recursion {
public static int algorithm(int number){
int result = 0;
if(number == 1){
result = 1;
}else{
result = number * algorithm(number - 1);
}
return result;
}
public static void main(String[] args) {
System.out.println("5!的结果为:" + algorithm(5));
}
}
运行结果:
图22.1 递归运行结果
23、题目:有5个人坐在一起,问第五个人多少岁?他说比第4个人大2岁。问第4个人岁数,他说比第3个人大2岁。问第三个人,又说比第2人大两岁。问第2个人,说比第一个人大两岁。最后问第一个人,他说是10岁。请问第五个人多大?
package com.remoa.algorithm.day12;
/**
* 题目:有5个人坐在一起,问第五个人多少岁?他说比第4个人大2岁。问第4个人岁数,他说比第3个人大2岁。问第三个人,又说比第2人大两岁。问第2个人,说比第一个人大两岁。最后问第一个人,他说是10岁。请问第五个人多大?
* @author Remoa
*
*/
public class Age {
public static int algorithm(int n){
if(n == 1){
return 10;
}else{
return 2 + algorithm(n - 1);
}
}
public static void main(String[] args) {
System.out.println("第五个人为" + algorithm(5) + "岁");
}
}
运行结果:
图23.1 求年龄运行结果
24、题目:给一个不多于5位的正整数,要求:一、求它是几位数,二、逆序打印出各位数字。
package com.remoa.algorithm.day12;
import java.util.Scanner;
/**
* 题目:给一个不多于5位的正整数,要求:一、求它是几位数,二、逆序打印出各位数字。
* @author Remoa
*
*/
public class PrintNumber {
public static void algorithm(int number){
for(int i = 1; i <= 5; i++){
if(number / (int)Math.pow(10, i) == 0){
System.out.println(number + "为" + i + "位数");
for(int j = i; j >= 1; j--){
System.out.print(number % 10);
number /= 10;
}
break;
}
}
}
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
System.out.println("请输入一个不多于5位的正整数:");
algorithm(scanner.nextInt());
scanner.close();
}
}
运行结果:
图24.1 逆序输出运行结果
25、题目:一个5位数,判断它是不是回文数。即12321是回文数,个位与万位相同,十位与千位相同。
package com.remoa.algorithm.day13;
import java.util.Scanner;
/**
* 题目:一个5位数,判断它是不是回文数。即12321是回文数,个位与万位相同,十位与千位相同。
* @author Remoa
*
*/
public class Palindrome {
public static void algorithm(int number){
int[] a = new int[5];
System.out.print(number);
for(int i = 0; i < 5; i++){
a[i] = number % 10;
number /= 10;
}
if(a[1] == a[3] && a[0] == a[4]){
System.out.println("是一个回文数");
}else{
System.out.println("不是一个回文数");
}
}
public static void main(String []args){
Scanner scanner = new Scanner(System.in);
System.out.println("请输入一个五位数:");
int number = scanner.nextInt();
algorithm(number);
scanner.close();
}
}
运行结果:
图25.1 回文数运行结果
26、题目:请输入星期几的第一个字母来判断一下是星期几,如果第一个字母一样,则继续 判断第二个字母。
package com.remoa.algorithm.day13;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
/**
* 题目:请输入星期几的第一个字母来判断一下是星期几,如果第一个字母一样,则继续 判断第二个字母。
* @author Remoa
*
*/
public class WhatDayIsIt {
public static void judge(char c) throws IOException{
switch(c){
case 'M':
case 'm':
System.out.println("星期一");
break;
case 'T':
case 't':
System.out.println("请输入下一个字符:");
BufferedReader bf = new BufferedReader(new InputStreamReader(System.in));
char c2 = (char)bf.read();
if(c2 == 'U' || c2 == 'u'){
System.out.println("星期二");
}
else if(c2 == 'h' || c2 == 'H'){
System.out.println("星期四");
}else{
System.out.println("输入错误");
}
break;
case 'W':
case 'w':
System.out.println("星期三");
break;
case 'F':
case 'f':
System.out.println("星期五");
break;
case 'S':
case 's':
System.out.println("请输入下一个字符:");
BufferedReader bf2 = new BufferedReader(new InputStreamReader(System.in));
char c3 = (char)bf2.read();
if(c3 == 'a' || c3 == 'A'){
System.out.println("星期六");
}
else if(c3 == 'u' || c3 == 'U'){
System.out.println("星期天");
}else{
System.out.println("输入错误");
}
break;
default:
System.out.println("输入错误");
break;
}
}
public static void main(String[] args) throws IOException {
char c;
System.out.println("请输入星期几的第一个字母:");
BufferedReader bf = new BufferedReader(new InputStreamReader(System.in));
c = (char)bf.read();
judge(c);
}
}
运行结果:
图26.1 求星期几运行结果
27、题目:求100之内的素数
package com.remoa.algorithm.day14;
/**
* 题目:求100之内的素数
* @author Remoa
*
*/
public class PrimeNumber {
public static void algorithm(){
int i, j, flag = 0, count = 0;
for(i = 2; i <= 100; i++){
flag = 1;
for(j = 2; j <= Math.sqrt(i); j++){
if(i % j == 0){
flag = 0;
break;
}
}
if(flag == 1){
if(count % 5 == 0 && count != 0){
System.out.println();
}
System.out.print(i + " ");
count++;
}
}
}
public static void main(String[] args) {
algorithm();
}
}
运行结果:
图27.1 求100以内素数运行结果
28、题目:对10个数进行排序
package com.remoa.algorithm.day14;
/**
* 题目:对10个数进行排序
* @author Remoa
*
*/
public class Sort {
//升序排列
public static void algorithm(int arr[], int low, int high){
int l = low, h = high;
int point = arr[low];
while(l < h){
while(l < h && arr[h] > point){
h--;
}
if(l < h){
int temp = arr[h];
arr[h] = arr[l];
arr[l] = temp;
l++;
}
while(l < h && arr[l] < point){
l++;
}
if(l < h){
int temp = arr[h];
arr[h] = arr[l];
arr[l] = temp;
h--;
}
}
if(l > low){
algorithm(arr, low, l - 1);
}
if(h < high){
algorithm(arr, l + 1, high);
}
}
public static void main(String []args){
int[] arr = new int[]{2,3,8,6,4,5,1,9,7,10};
System.out.println("原数组的序列为:");
for(int i = 0; i < arr.length; i++){
System.out.print(arr[i] + " ");
}
System.out.println();
algorithm(arr, 0, 9);
System.out.println("升序排序后的数组序列为:");
for(int i = 0; i < arr.length; i++){
System.out.print(arr[i] + " ");
}
}
}
运行结果:
图28.1 排序运行结果
29、题目:求一个3*3矩阵对角线元素之和
package com.remoa.algorithm.day15;
/**
* 题目:求一个3*3矩阵对角线元素之和
* @author Remoa
*
*/
public class Sum {
public static int algorithm(int [][]arr){
int sum = 0;
for(int i = 0; i < 3; i++){
for(int j = 0; j < 3; j++){
if(i == j){
sum += arr[i][j];
}
}
}
return sum;
}
public static void main(String[] args) {
int arr[][] = new int[][]{{1,2,3}, {4,5,6}, {7,8,9}};
System.out.println("对角线元素之和为:" + algorithm(arr));
}
}
运行结果:
图29.1 对角线元素求和运行结果
30、题目:有一个已经排好序的数组。现输入一个数,要求按原来的规律将它插入数组中。
package com.remoa.algorithm.day15;
import java.util.Random;
import java.util.Scanner;
/**
* 题目:有一个已经排好序的数组。现输入一个数,要求按原来的规律将它插入数组中。
* @author Remoa
*
*/
public class InsertNumber {
public static void algorithm(int arr[], int number){
if(number > arr[arr.length - 2]){
arr[arr.length - 1] = number;
}else{
for(int i = 0; i < arr.length; i++){
if(number < arr[i]){
for(int j = arr.length - 1; j > i; j--){
arr[j] = arr[j - 1];
}
arr[i] = number;
break;
}
}
}
}
public static void main(String[] args) {
int[] arr = new int[6];
int temp;
Random random = new Random();
for(int i = 0; i < 5; i++){
arr[i] = random.nextInt(100);
}
for(int i = 0; i < 5; i++){
for(int j = i + 1; j < 5; j++){
if(arr[i] > arr[j]){
temp = arr[j];
arr[j] = arr[i];
arr[i] = temp;
}
}
}
System.out.println("原来数组元素序列为:");
for(int i = 0; i < 5; i++){
System.out.print(arr[i] + " ");
}
System.out.println();
System.out.println("请输入待插入的元素:");
Scanner scanner = new Scanner(System.in);
int number = scanner.nextInt();
algorithm(arr, number);
System.out.println("插入新元素后数组元素序列为:");
for(int i = 0; i < arr.length; i++){
System.out.print(arr[i] + " ");
}
scanner.close();
}
}
运行结果:
图30.1 插入数据运行结果