首页 > 代码库 > Java经典算法(一)

Java经典算法(一)

Java中经典的一些算法(一)

【程序01】题目:古典问题:有一对兔子,从出生后第3个月起每个月都生一对兔子,小兔子长到第四个月后每个月又生一对兔子,假如兔子都不死,问每个月的兔子总数为多少?


分析:第一个月兔子对数为1,第二个月兔子对数为1,第三个月兔子对数为2,第四个月兔子对数为3,第五个月兔子对数为5,....

该"兔子数列"(也即是斐波那契数列),从第二项开始,每一项都等于前两项之和,1,1,2,3,5,8,13,21,34,....   需要注意的是第一个1代表的是第1项,第0项为0。


下面的Java代码只是根据输入的月份,来输出当月的兔子对数。


import java.util.Scanner;

public class Java01 {
	public static void main(String[] args) {
		Scanner sc = new Scanner(System.in);
		System.out.print("请输入要查询的月份:");
		int month = sc.nextInt();
		System.out.println("第" + month + "个月兔子共有" + fib(month) + "对。");
	}

	public static int fib(int month) {
		if (month == 1 || month == 2) {
			return 1;
		} else {
			return fib(month - 1) + fib(month - 2);
		}
	}
}


运行示例:


技术分享



【程序02】题目:判断101-200之间有多少个素数,并输出所有素数。


分析:素数,它除了能表示为它自己和1的乘积以外,不能表示为任何其他两个整数的乘积。
判断素数的一个方法是:用一个数分别去除2到这个数的平方根,如果能被整除,则表明此数不是素数,反之是素数。


import java.util.ArrayList;
public class Java02 {
	public static void main(String[] args) {
		int m, n;
		int temp = 0;
		ArrayList<Integer> alist = new ArrayList<Integer>();
		A: for (n = 101; n <= 200; n++) { // 采用了标签的形式
			for (m = 2; m < n / 2; m++) {
				if (n % m == 0) {
					continue A;
				}
			}
			alist.add(n);
		}
		
		System.out.println("101-200共有"+alist.size()+"个素数。");
		System.out.println("分别如下:");
		for(int one:alist){
			temp++;
			System.out.print(one+" ");
			if (temp % 5 == 0) {     //每行输出5个
				System.out.println();
			}
		}
	}

}

运行结果:

技术分享

【程序03】题目:求100之内的素数

分析:和程序02的思路大体一致。
public class Java03 {
	public static void main(String[] args) {
		int m, n;
		int temp = 0;
		System.out.println("100以内的素数有:");
		A: for (n = 2; n <= 100; n++) { // 采用了标签的形式
			for (m = 2; m < n / 2; m++) {
				if (n % m == 0) {
					continue A;
				}
			}
			System.out.print(n + " ");
			temp++;

			if (temp % 5 == 0) { // 每行输出5个
				System.out.println();
			}
		}
	}

}

输出结果:

技术分享


【程序04】题目:有1、2、3、4个数字,能组成多少个互不相同且无重复数字的三位数?都是多少?

import java.util.ArrayList;
public class Java04 {
	 public static void main(String[] args) {  
		 ArrayList<Integer> alist = new ArrayList<Integer>();
	        int temp = 0; 
	        int count = 0;
	        for (int i = 1; i <= 4; i++) {  
	            for (int j = 1; j <= 4; j++) {  
	                for (int k = 1; k <= 4; k++) {  
	                    if (i != j && j != k && k != i) {  
	                        temp = i * 100 + j * 10 + k;  
	                        alist.add(temp);
	                    }  
	                }  
	            }  
	        } 
	    	System.out.println("能组成"+alist.size()+"个互不相同且无重复数字的三位数。");
	    	System.out.println("分别是:");
	        for(int one:alist){
	        	count++;
				System.out.print(one+" ");
				if (count % 5 == 0) {     //每行输出5个
					System.out.println();
				}     	
	        }
	    }  
}

输出结果:
技术分享

【程序05】题目:将一个正整数分解质因数。例如:输入90,打印出90=2*3*3*5。

import java.util.Scanner;
public class Java05 {
	public static void main(String[] args) {
		Scanner sc = new Scanner(System.in);
		System.out.print("请输入一个正整数:");
		int n = sc.nextInt();
		System.out.println(n+"分式因解的结果如下:");
		System.out.print(n + "=");
		solution(n);		
	}

	public static void solution(int n) {
		for (int i = 2; i <= n; i++) {
			if (n == i) {
				System.out.println(i);
				return;
			}
			if (n > i && (n % i == 0)) {
				System.out.print(i + "*");
				solution(n / i);
				break;
			}

		}
	}
}

输入示例:

技术分享

【程序06】题目:输入一行字符,分别统计出其中英文字母、空格、数字和其它字符的个数。

import java.util.Scanner;
public class Java06 {
	public static void main(String[] args) {
		System.out.println("请输入一行字符:");
		Scanner sc = new Scanner(System.in);
		String inStr = sc.nextLine();
		System.out.println("统计结果如下:");
		count(inStr);
	}

	public static void count(String inStr) {
		int letter = 0;
		int number = 0;
		int blank = 0;
		int other = 0;
		for (int i = 0; i < inStr.length(); i++) {
			char in = inStr.charAt(i);
			if (in >= '0' && in <= '9')
				number++;
			else if ((in >= 'a' & in <= 'z') || (in >= 'A' & in <= 'Z'))
				letter++;
			else if (in == ' ')
				blank++;
			else
				other++;
		}
		System.out.println("字母的个数为:" + letter + "\n数字的个数为:" + number
				+ "\n空格的个数为:" + blank + "\n其他符号的个数为:" + other);
	}
}

输入示例:

技术分享



【程序07】题目:猴子吃桃问题:猴子第一天摘下若干个桃子,当即吃了一半,还不瘾,又多吃了一个 第二天早上又将剩下的桃子吃掉一半,又多吃了一个。以后每天早上都吃了前一天剩下的一半零一个。到第10天早上想再吃时,见只剩下一个桃子了。求第一天共摘了多少。


分析:假设猴子每天吃桃前的数量为 sum,吃的桃子的数量是sum/2+1,则每天桃子的剩余量为:res = sum-(sum/2+1),即 sum =(res+1)*2。根据题意,第10天的桃子sum为1,可以理解为第9天的res为1,从而可以得到第9天的sum=(1+1)*2=4,第9天的sum也即是第8天的res ...就这样依次进行,就可以得出第一天共摘了多少个桃子。

public class Java07 {
	public static void main(String[] args) {
		int sum = 0;
		int res = 1;
		for (int day = 9; day >= 1; day--) {
			sum = (res + 1) * 2;
			res = sum;
		}
		System.out.println("第一天共摘了" + sum + "个桃子。");
	}

}

运行结果:

技术分享

Java经典算法(一)