1.古典问题:有一对兔子,从出生后第3个月起每个月都生一对兔子,小兔子长到第三个月后每个月又生一对兔子,假如兔子都不死,问每个月的兔子总数是多少对?
程序分析:每个月兔子总数是1,1,2,3,5,8,13,21……发现规律,从第三个月开始,每个月的兔子总数是前两个月的兔子总数的和。(这个数列其实是斐波那契数列)
public class Question1 { public static void main(String[] args){ Scanner in = new Scanner(System.in); System.out.println("请输入第几个月:"); int month = in.nextInt(); int temp1 = 1; //表示上上个月的兔子总数 int temp2 = 1; //表示上个月的兔子总数 int count = 0; if(month == 1){ System.out.println("该月兔子总数是:" + 1); }else if(month == 2){ System.out.println("该月兔子总数是:" + 1); }else{ for(int i=0; i<month-2; i++){ count = temp1 + temp2; temp1 = temp2; temp2 = count; } System.out.println("该月兔子总数是:" + count); } } }
2. 判断101-200之间有多少个素数,并输出所有素数?
程序分析:素数是指只有1和它本身两个正因数的自然数,给出一个自然数,我们只需要从2除到该自然数的平方根,如果都不能整除,说明该自然数为素数。
public class Question2 { public static void main(String[] args){ int count = 0; for(int i=101; i<=200; i++){ if(isPrimeNumber(i)){ count++; System.out.println(i); } } System.out.println("----->总共有" + count + "个素数"); } /** * 判断一个数是不是素数 * * @return true说明n是素数,false说明n不是素数 */ private static boolean isPrimeNumber(int n){ if(n == 1){ return false; } for(int i=2;i<=Math.sqrt(n);i++){ if(n%i == 0){ return false; } } return true; } }
3.打印出所有的“水仙花数”,所谓“水仙花数”是指一个三位数,其各位数字立方和等于该数本身。例如:153就是一个“水仙花数”因为153=1的三次方+5的三次方+3的三次方?
程序分析:我们需要获取到一个给定三位数的个位数、十位数、百位数,然后进行相等性判断即可。
public class Question3 { public static void main(String[] args) { for(int i=100; i<=999; i++){ if(isNarcissusFew(i)){ System.out.println(i); } } } /** * 判断一个三位数是否是“水仙花数” * * @param n * @return true 说明n是“水仙花数”,false说明n不是“水仙花数” */ private static boolean isNarcissusFew(int n) { int singleDigit = (n % 100) % 10; // 取个位数 int tensDigit = (n / 10) % 10; // 取十位数 int hundredsDigit = n / 100; // 取百位数 int cube = singleDigit * singleDigit * singleDigit + tensDigit * tensDigit * tensDigit + hundredsDigit * hundredsDigit * hundredsDigit; if(cube == n){ return true; }else{ return false; } } }
4.将一个正整数分解质因数。例如:90=2*3*3*5。
程序分析:首先判断给定的正整数n是否是合数,如果不是,则打印n是素数,无法分解;如果n是合数,则按一下步骤完成:
(1)如果质数k恰等于n,说明分解质因数过程已经结束,将List中的质因数打印即可;
(2)2<k<n,如果质数k能被n整除,说明k是n的质因数,将k的值加入到List中,然后用n除以k的商作为新的n,重复执行第一步;
(3)如果n不能被k整除,则用k+1作为k的值,重复执行第二步。
public class Question4 { static LinkedList<Integer> primeFactorList; public static void main(String[] args) { primeFactorList = new LinkedList<Integer>();//用来存质因数 Scanner in = new Scanner(System.in); int n = in.nextInt(); if(isPrimeNumber(n)){ System.out.println(n + "是素数,无法分解!!!"); return; } solve(n); if(primeFactorList.size()>1){ for(int i=0 ; i<primeFactorList.size(); i++){ int a = primeFactorList.get(i); System.out.print(a); if(i == primeFactorList.size()-1){ break; //如果a是List中最后一个元素,则不打印* } System.out.print("*"); } } } /** * 通过循环判断得到数n的质因数,加入到primeFactorList中 * * @param n */ private static void solve(int n){ for(int i=2;i<=n;i++){ if((n%i) == 0){ if(isPrimeNumber(i)){ primeFactorList.add(i); //将质因数加入到list中 int temp = n/i; if(temp != 1){ solve(temp); //递归调用solve } break; //得到了一个质因数,跳出循环 } } } } /** * 判断给定的数n是否为素数(即质数) * * @param n * @return true说明n是素数,false说明n不是素数 */ private static boolean isPrimeNumber(int n){ if(n == 1){ return false; } for(int i=2;i<=Math.sqrt(n);i++){ if(n%i == 0){ return false; } } return true; } }
Java经典习题(1)
时间: 2024-11-07 10:49:10