1、JAVA 经典算法 41 题【程序 1】 题目:古典问题:有一对兔子,从出生后第 3 个月起每个月都生一对兔子,小兔子长到第四个月后每个月又生一对兔子,假如兔子都不死,问每个月的兔子总数为多少?1. 程序分析:兔子的规律为数列 1,1,2,3,5,8,13,21public class Demo01 public static void main(String args) int i = 0;for (i = 1; i k,但 n 能被 k 整除,则应打印出 k 的值,并用 n 除以 k 的商,作为新的正整数你,重复执行第一步。(3)如果 n 不能被 k 整除,则用 k+1 作为 k 的值,重
2、复执行第一步。import java.util.Scanner;public class Demo05 public Demo05() super();public void fenjie(int n) for (int i = 2; i =90 分的同学用 A 表示,60-89 分之间的用 B 表示,60 分以下的用 C 表示。1.程序分析: (ab)?a:b 这是条件运算符的基本例子。import java.util.Scanner;public class Demo06 public static void main(String args) System.out.println(“请输
3、入N的值:“);Scanner s = new Scanner(System.in);int N = s.nextInt();System.out.println(N = 90 ? “A“ : (N = 60 ? “B“ : “C“);【程序 6】 题目:输入两个正整数 m 和 n,求其最大公约数和最小公倍数。1.程序分析:利用辗除法。最大公约数:public class Demo07 public static void main(String args) commonDivisor(24, 32);public static int commonDivisor(int M, int N)
4、if (N y 则将 x 与 y 的值进行交换,然后再用 x 与 z 进行比较,如果 xz 则将 x 与 z 的值进行交换,这样能使 x 最小。import java.util.Arrays;import java.util.Scanner;public class Demo18 public static void main(String args) System.out.print(“请输入三个数n“);Scanner input = new Scanner(System.in);int a = new int3;for (int i = 0; i = 1; i-) for (j = 1;
5、 j = 1; i-) for (int k = 1; k 1) value = n * fac(n - 1);return value;public static void main(String args) Scanner s = new Scanner(System.in);int n = s.nextInt();System.out.println(n + “的阶乘为:“ + fac(n);【程序 23】 题目:有 5 个人坐在一起,问第五个人多少岁?他说比第 4 个人大 2 岁。问第 4 个人岁数,他说比第 3 个人大 2 岁。问第三个人,又说比第 2 人大两岁。问第 2 个人,说比
6、第一个人大两岁。最后问第一个人,他说是 10 岁。请问第五个人多大?1.程序分析:利用递归的方法,递归分为回推和递推两个阶段。要想知道第五个人岁数,需知道第四人的岁数,依次类推,推到第一人(10 岁) ,再往回推。直接求解:public class H01 public static void main(String args) int n = 10;for (int i = 0; i = 100000) System.out.println(“Error Input, please run this program Again“);System.exit(0);if (a = 0 i-) S
7、ystem.out.print(chi);个人修改方法:import java.util.Scanner;public class H06 public static void main(String args) Scanner s = new Scanner(System.in);String str = s.next();if (str.matches(“d+“) / 正则表达式System.out.println(“输入的是“ + str.length() + “位数“);StringBuffer buf = new StringBuffer(str);System.out.printl
8、n(buf.reverse();【程序 25】 题目:一个 5 位数,判断它是不是回文数。即 12321 是回文数,个位与万位相同,十位与千位相同。原方法:import java.util.Scanner;public class Demo29 static int a = new int5;static int b = new int5;public static void main(String args) boolean is = false;Scanner s = new Scanner(System.in);long l = s.nextLong();if (l 99999 | l
9、= 0; i-) ai = (int) (l / (long) Math.pow(10, i);l = (l % (long) Math.pow(10, i);System.out.println();for (int i = 0, j = 0; i 99999) System.out.println(“输入错误!“);System.exit(0);char ch = str.toCharArray();if (ch0 = ch4 else System.out.println(str + “不是回文数“);【程序 26】 题目:请输入星期几的第一个字母来判断一下是星期几,如果第一个字母一样,
10、则继续判断第二个字母。1.程序分析:用情况语句比较好,如果第一个字母一样,则判断用情况语句或 if 语句判断第二个字母。import java.util.Scanner;public class Demo31 public static void main(String args) / 思路很正确,就是太长了/ 保存用户输入的第二个字母char weekSecond;/ 将Scanner类示例化为input对象,用于接收用户输入Scanner input = new Scanner(System.in);/ 开始提示并接收用户控制台输入System.out.print(“请输入星期值英文的第一
11、个字母,我来帮您判断是星期几:“);String letter = input.next();/ 判断用户控制台输入字符串长度是否是一个字母if (letter.length() = 1) / 利用取第一个索引位的字符来实现让Scanner接收char类型输入char weekFirst = letter.charAt(0);switch (weekFirst) case m:/ 当输入小写字母时,利用switch结构特性执行下一个带break语句的case分支,以实现忽略用户控制台输入大小写敏感的功能case M:System.out.println(“星期一(Monday)“);break
12、;case t:/ 当输入小写字母时,利用switch结构特性执行下一个带break语句的case分支,以实现忽略用户控制台输入大小写敏感的功能case T:System.out.print(“由于星期二(Tuesday)与星期四(Thursday)均以字母T开头,故需输入第二个字母才能正确判断:“);letter = input.next();/ 判断用户控制台输入字符串长度是否是一个字母if (letter.length() = 1) / 利用取第一个索引位的字符来实现让Scanner接收char类型输入weekSecond = letter.charAt(0);/ 利用或(|)运算符来实
13、现忽略用户控制台输入大小写敏感的功能if (weekSecond = U | weekSecond = u) System.out.println(“星期二(Tuesday)“);break;/ 利用或(|)运算符来实现忽略用户控制台输入大小写敏感的功能 else if (weekSecond = H | weekSecond = h) System.out.println(“星期四(Thursday)“);break;/ 控制台错误提示 else System.out.println(“输入错误,不能识别的星期值第二个字母,程序结束!“);break; else / 控制台错误提示Syste
14、m.out.println(“输入错误,只能输入一个字母,程序结束!“);break;case w:/ 当输入小写字母时,利用switch结构特性执行下一个带break语句的case分支,以实现忽略用户控制台输入大小写敏感的功能case W:System.out.println(“星期三(Wednesday)“);break;case f:/ 当输入小写字母时,利用switch结构特性执行下一个带break语句的case分支,以实现忽略用户控制台输入大小写敏感的功能case F:System.out.println(“星期五(Friday)“);break;case s:/ 当输入小写字母时,
15、利用switch结构特性执行下一个带break语句的case分支,以实现忽略用户控制台输入大小写敏感的功能case S:System.out.print(“由于星期六(Saturday)与星期日(Sunday)均以字母S开头,故需输入第二个字母才能正确判断:“);letter = input.next();/ 判断用户控制台输入字符串长度是否是一个字母if (letter.length() = 1) / 利用取第一个索引位的字符来实现让Scanner接收char类型输入weekSecond = letter.charAt(0);/ 利用或(|)运算符来实现忽略用户控制台输入大小写敏感的功能if
16、 (weekSecond = A | weekSecond = a) System.out.println(“星期六(Saturday)“);break;/ 利用或(|)运算符来实现忽略用户控制台输入大小写敏感的功能 else if (weekSecond = U | weekSecond = u) System.out.println(“星期日(Sunday)“);break;/ 控制台错误提示 else System.out.println(“输入错误,不能识别的星期值第二个字母,程序结束!“);break; else / 控制台错误提示System.out.println(“输入错误,只
17、能输入一个字母,程序结束!“);break;default:/ 控制台错误提示System.out.println(“输入错误,不能识别的星期值第一个字母,程序结束!“);break; else / 控制台错误提示System.out.println(“输入错误,只能输入一个字母,程序结束!“);【程序 27】 题目:求 100 之内的素数public class Demo32 public static void main(String args) int sum, i;for (sum = 2; sum sum / 2)System.out.println(sum + “是素数“ );【程
18、序 28】 题目:对 10 个数进行排序。1.程序分析:可以利用选择法,即从后 9 个比较过程中,选择一个最小的与第一个元素交换,下次类推,即用第二个元素与后 8 个进行比较,并进行交换。本例代码为生成随机 10 个数排序,并输入 1 个数,插入重排序输出:import java.util.Arrays;import java.util.Random;import java.util.Scanner;public class Demo33 public static void main(String args) int arr = new int11;Random r = new Random
19、();for (int i = 0; i myarrk) temp = myarri;myarri = myarrk;myarrk = temp;System.out.println(“);for (int k = 1; k myarr11) temp = myarr11;for (int j = 11; j = k + 1; j-)myarrj = myarrj - 1;myarrk = temp;System.out.println(“);for (int k = 1; k = 0; i-) System.out.print(ai + “ “);【程序 32】 题目:取一个整数 a 从右端
20、开始的 47 位。程序分析:可以这样考虑(程序并未这样实现,思想比较复杂):(1)先使 a 右移 4 位。(2)设置一个低 4 位全为 1,其余全为 0 的数。可用(0 amax)max = i; / 遍历数组,如果大于amax ,就把他的数组下标赋给maxif (ai list = new LinkedList();for (int i = 0; i temp1 = list.subList(list.size() - m, list.size();List temp2 = list.subList(0, list.size() - m);temp2.addAll(0, temp1);Sys
21、tem.out.println(“移动后数据排序为:“);for (int t : temp2) System.out.print(t + “ “);【程序 37】 题目:有 n 个人围成一圈,顺序排号。从第一个人开始报数(从 1 到 3 报数) ,凡报到 3的人退出圈子,问最后留下的是原来第几号的那位。(约瑟夫环问题,百度百科有时间复杂度最简单的数学方法)该题原举例代码:import java.util.Scanner;public class Demo42 public static void main(String args) Scanner s = new Scanner(System
22、.in);int n = s.nextInt();boolean arr = new booleann;for (int i = 0; i 1) if (arrindex = true) / 当在圈里时countNum+; / 报数递加if (countNum = 3) / 报道3时countNum = 0;/ 从零开始继续报数arrindex = false;/ 此人退出圈子leftCount-;/ 剩余人数减一index+;/ 每报一次数,下标加一if (index = n) / 是循环数数,当下标大于 n时,说明已经数了一圈,index = 0;/ 将下标设为零重新开始。for (int
23、 i = 0; i 1) if (aj = 1) num+;if (num = 3) aj = 0;num = 0;left-;j+;if (j = a.length) j = 0;for (int i = 0; i l = new LinkedList();System.out.println(“请输入人数:“);Scanner s = new Scanner(System.in);int len = s.nextInt();for (int i = 0; i = l.size() i = 0;for (int t : l) if (t != 0) System.out.println(“最
24、后留下的人是“ + t + “号。“);【程序 38】 题目:写一个函数,求一个字符串的长度,在 main 函数中输入字符串,并输出其长度。(其实不用另外加入函数)import java.util.Scanner;public class Demo43 public static void main(String args) Scanner s = new Scanner(System.in);System.out.println(“请输入一个字符串:“);String mys = s.next();System.out.println(str_len(mys);public static i
25、nt str_len(String x) return x.length();【程序 39】 题目:编写一个函数,输入 n 为偶数时,调用函数求 1/2+1/4+.+1/n,当输入 n 为奇数时,调用函数 1/1+1/3+.+1/nimport java.util.Scanner;public class Demo48 public static double ouShu(int n) double result = 0;for (int i = 2; i list = new ArrayList();list.add(“010101“);list.add(“010003“);list.add(“010201“);Collections.sort(list);for (int i = 0; i = 10 System.out.println(“809*?=“ + 809 * i);System.exit(0);