码迷,mamicode.com
首页 > 编程语言 > 详细

Java经典习题(1)

时间:2014-06-07 01:17:17      阅读:314      评论:0      收藏:0      [点我收藏+]

标签:java

1.古典问题:有一对兔子,从出生后第3个月起每个月都生一对兔子,小兔子长到第三个月后每个月又生一对兔子,假如兔子都不死,问每个月的兔子总数是多少对?

程序分析:每个月兔子总数是1123581321……发现规律,从第三个月开始,每个月的兔子总数是前两个月的兔子总数的和。(这个数列其实是斐波那契数列)

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整除,说明kn的质因数,将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),布布扣,bubuko.com

Java经典习题(1)

标签:java

原文地址:http://blog.csdn.net/bear_huangzhen/article/details/27367479

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!