Java经典习题(1)

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

Java经典习题(1)的相关文章

Java经典习题(2)

6.输入一行字符,分别统计出其中英文字母.空格.数字和其他字符的个数. 程序分析:从控制台获取一行输入,然后对String字符串的内容进行判断,统计每种字符的个数,直到遇到回车"\n"为止. import java.util.Scanner; public class Question6 { public static void main(String[] args) { Scanner sc = new Scanner(System.in); String str = sc.next

Java经典习题(3)

11.中国古代算书<张丘建算经>中有一道著名的百鸡问题:公鸡每只值5 文钱,母鸡每只值3 文钱,而3 只小鸡值1 文钱.用100 文钱买100 只鸡,问:这100 只鸡中,公鸡.母鸡和小鸡各有多少只? 程序分析:这个题目需要利用嵌套的for循环来解决,x表示公鸡的只数,y表示母鸡的只数,z表示小鸡的只数.x.y.z都是从0循环到100,需要满足3个条件:a)x+y+z==100; b)5*x+3*y+z/3==100; c)z%3==0 . public class Question11 {

Java经典习题7

/*题目:输入一行字符,分别统计出其中英文字母.空格.数字和其它字符的个数.*/ import java.util.*; public class Class7 { public static void main(String[] args){ int zimu = 0; int kongge = 0; int shuzi = 0; int qita = 0; char[] ch = null; System.out.println("请输入:"); Scanner s = new S

Java经典习题6

/*题目:输入两个正整数m和n,求其最大公约数和最小公倍数.*/ import java.util.*; public class Class6 { public static void main(String[] args) { int a1; int a2; Scanner s = new Scanner(System.in); System.out.println("输入第一个数:"); int a = s.nextInt(); System.out.println("

java经典习题3

/*题目:打印出所有的 "水仙花数 ",所谓 "水仙花数 "是指一个三位数,其各位数字立方和等于该数本身.*/public class Class3 { public static void main(String[] args){ int a; int b; int c; System.out.println("水仙花数为:"); for(int i = 100; i <= 999; i++){ a = i/100; b = (i - a

Java经典23种设计模式之结构型模式(二)

接上篇,本文介绍结构型模式里的组合模式.装饰模式.外观模式. 一.组合模式(Composite) 组合模式:将对象组合成树形结构,表示"部分--整体"的层次结构.最终达到单个对象和组合对象的使用具有一致性.单看这句话貌似有点抽象,其实比较简单. 以李云龙的独立团为例,目的要统计赵嘉宇一战共歼灭敌人多少个.最高的级别是团,一个团有若干个营,一个营有若干个排,一个排有若干个战士.(为了简化问题,排下面就不设行政单位了).很自然的,李云龙给营长开会回去给老子统计.营长回去给各个排长开会,赶紧

(转)Java经典设计模式(3):十一种行为型模式(附实例和详解)

原文出处: 小宝鸽 Java经典设计模式共有21中,分为三大类:创建型模式(5种).结构型模式(7种)和行为型模式(11种). 本文主要讲行为型模式,创建型模式和结构型模式可以看博主的另外两篇文章:Java经典设计模式之五大创建型模式(附实例和详解).Java经典设计模式之七大结构型模式(附实例和详解). 行为型模式细分为如下11种:策略模式.模板方法模式.观察者模式.迭代子模式.责任链模式.命令模式.备忘录模式.状态模式.访问者模式.中介者模式.解释器模式. 接下来对11种行为型模式逐个进行介

Java经典编程题50道之五十

有五个学生,每个学生有3门课的成绩,从键盘输入以上数据(包括学生号,姓名,三门课成绩),计算出平均成绩,况原有的数据和计算出的平均分数存放在磁盘文件 "stud"中. public class Example50 {    public static void main(String[] args) {        stud();    } public static void stud() {        Scanner ss = new Scanner(System.in); 

(转)Java经典设计模式(2):七大结构型模式(附实例和详解)

原文出处: 小宝鸽 总体来说设计模式分为三大类:创建型模式.结构型模式和行为型模式. 博主的上一篇文章已经提到过创建型模式,此外该文章还有设计模式概况和设计模式的六大原则.设计模式的六大原则是设计模式的核心思想,详情请看博主的另外一篇文章:Java经典设计模式之五大创建模式(附实例和详解). 接下来我们看看结构型模式,共七种:适配器模式.装饰器模式.代理模式.外观模式.桥接模式.组合模式.享元模式.其中适配器模式主要分为三类:类的适配器模式.对象的适配器模式.接口的适配器模式.其中的对象的适配器