一、题目描述
1、古典问题:有一对兔子,从出生后第3个月起每个月都生一对兔子,小兔子长到第三个月后每个月又生一对兔子,假如兔子都不死,问每个月的兔子对数为多少?
程序分析: 兔子的规律为数列1,1,2,3,5,8,13,21.... ,该题其实就是斐波那契数列的一种。
2、判断m-n之间有多少个素数,并输出所有素数。
程序分析:判断素数的方法:用一个数n分别去除2到sqrt(n),这里是Math自带的函数sqrt()求该数的平方根,如果能被整除,则表明此数不是素数,反之是素数。
3、打印出所有的"水仙花数",所谓"水仙花数"是指一个三位数,其各位数字立方和等于该数本身。
例如:153是一个"水仙花数",因为153=1的三次方+5的三次方+3的三次方。
程序分析:利用for循环控制100-999个数,每个数分解出个位,十位,百位,然后判断是否满足各位数字立方和等于该数本身。
二、JAVA源代码
1、程序1
package tong.yue.hong; import java.util.Scanner; import javax.xml.transform.Templates; /** * 题目:古典问题:有一对兔子,从出生后第3个月起每个月都生一对兔子,小兔子长到第三个月后每个月又生一对兔子,假如兔子都不死,问每个月的兔子对数为多少? 程序分析: 兔子的规律为数列1,1,2,3,5,8,13,21.... 总之,除了第一个和第二个月兔子数量为1,其他月份是前两个月份兔子对数之和。 * @author tong * */ public class Fibonacci { public static void main(String[] args) { System.out.println("请输入第几个月:"); Scanner scanner = new Scanner(System.in); String month = scanner.nextLine(); diedai(Integer.parseInt(month)); digui(Integer.parseInt(month)); System.out.println("第"+month+"个月有兔子"+digui(Integer.parseInt(month))+"对"); } /** * 使用递归的方法求该数列,源代码简单,但是效率比较低,内存消耗大 * @param parseInt * @return */ private static int digui(int parseInt) { if(parseInt==1||parseInt==2){ return 1; }else{ return digui(parseInt-1)+digui(parseInt-2); } } /** * 使用普通的方法,根据该数列的特性,除了第一个和第二个月兔子数量为1,其他月份是前两个月份兔子对数之和。 * @param parseInt */ private static void diedai(int parseInt) { int first = 1; int second = 1; int temp = 0; for (int i = 3; i <=parseInt; i++) { temp = first; first = second; second = temp+second; System.out.println("第"+i+"个月有兔子"+second+"对"); } } }
2、程序二
package tong.yue.hong; import java.util.Scanner; /* * 题目:判断m-n之间有多少个素数,并输出所有素数。 程序分析:判断素数的方法:用一个数分别去除2到sqrt(这个数),如果能被整除,则表明此数不是素数,反之是素数。 */ public class Sushu { public static void main(String[] args) { Scanner scanner = new Scanner(System.in); System.out.println("请输入数字下限:"); int low = scanner.nextInt(); System.out.println("请输入数字上限:"); int high = scanner.nextInt(); if (low>high) { System.out.println("您输入的数据有误,请重新输入!"); System.out.println("请输入数字下限:"); low = scanner.nextInt(); System.out.println("请输入数字上限:"); high = scanner.nextInt(); } System.out.println(low+"-"+high+"之间的所有素数:"); int count = 0; for (int i = low; i <= high; i++) { if(isPrime(i)){ count ++; System.out.print(i+" "); //每输出10个素数就换行,便于观察 if(count%10==0){ System.out.println(); } } } System.out.println("\n总共"+count+"个素数"); } /** * 该方法用来判断一个数是否为素数,判断条件是将该数除以从2开始到sqrt(该数),只要有一个能整除就不是素数,所有数都不能整除即素数 * @param i * @return */ private static boolean isPrime(int i) { if (i==1) { return false; } for (int j = 2; j < Math.sqrt(i); j++) { if(i%j==0){ return false; } } return true; } }
3、程序3
package tong.yue.hong; /** * 打印出所有的"水仙花数",所谓"水仙花数"是指一个三位数,其各位数字立方和等于该数本身。例如:153是一个"水仙花数",因为153=1的三次方+5的三次方+3的三次方。 程序分析:利用for循环控制100-999个数,每个数分解出个位,十位,百位。 * @author Administrator * */ public class Shuixianhua { public static void main(String[] args) { System.out.println("100-999之间的水仙花数:"); //使用isShuixianhua()方法 for (int i = 100; i < 1000; i++) { if(isShuixianhua(i)){ System.out.print(i+" "); } } System.out.println("\n100-999之间的水仙花数:"); //使用isLotus()方法 for (int i = 100; i < 1000; i++) { if(isLotus(i)){ System.out.print(i+" "); } } } /** * 这里调用java自带的pow()方法求一个数的3次方 * @param i * @return */ private static boolean isShuixianhua(int i) { //获取个位:i%10,获取十位:i/10%10,获取百位:i/100 int sum = (int)(Math.pow(i%10, 3)+Math.pow(i/10%10, 3)+Math.pow(i/100, 3)); if (i==sum) { return true; } return false; } /** * 这里根据各位的数据关系将每个位上的数字取出并判断 * @param num * @return */ private static boolean isLotus(int num){ int m = 0; int n = num; int sum = 0; //获取百位 m = n/100; //源数据减去百位数乘以100就剩下十位和个位 n -= m*100; //百位数求立方 sum = m*m*m; //获取十位 m = n/10; //数据减去十位的部分就剩下个位的数据 n -= m*10; //判断各位数字立方和等于该数本身 sum += m*m*m + n*n*n; if(sum==num) return true; else return false; } }
时间: 2024-10-13 17:14:37