`
zpsailor
  • 浏览: 43759 次
  • 性别: Icon_minigender_1
  • 来自: 重庆
社区版块
存档分类
最新评论

编程经典问题及其Java求解(一)

阅读更多

这几天由于参加一个编程赛,做了些编程的练习,程序题就来自于javaeye中的朋友分享的一些经典程序题,现在我将自己用Java写出的部分题代码分享出来。

package com.sailor.game;

/**
 * 题目:猴子吃桃问题:猴子第一天摘下若干个桃子,当即吃了一半,还不瘾,又多吃了一个 第二天早上又将剩
 * 下的桃子吃掉一半,又多吃了一个。以后每天早上都吃了前一天剩下的一半零一个。到第10天早上想再吃时,见只剩下一个桃子了。求第一天共摘了多少。
 * 程序分析:采取逆向思维的方法,从后往前推断。
 * 
 * @author Sailor
 * 
 */
public class Monkey_Peach {

	public static void main(String[] args) {
		int[] peach = new int[10];
		peach[9] = 1;
		// 下面利用的是数组和循环将每天的桃子数量都求出来了
		for (int i = peach.length - 1; i > 0; i--) {
			peach[i - 1] = 2 * (peach[i] + 1);
		}
		for (int i = 0; i < peach.length; i++) {
			System.out.println(peach[i]);
		}
		System.out.println("第一天的桃子数:"+getPeach_Num(10, 1));
	}

	// 利用递归的方法来求第一天的桃子数,输入参数为天数和当天的桃子数,输出为第一天桃子数
	public static int getPeach_Num(int day, int peach_num) {
		if (day == 1)
			return peach_num;
		else if (day < 1 || peach_num < 0)
			return 0;
		else
			return getPeach_Num(day - 1, (peach_num + 1) * 2);
	}

}

 

 

package com.sailor.game;

/**
 * 输出9*9口诀
 * 
 * @author Sailor
 * 
 */
public class Times_Table {

	public static void main(String[] args) {
		for (int i = 1; i <= 9; i++) {
			for (int j = 1; j <= i; j++) {
				System.out.print(j + " * " + i + " = " + (i * j));
				System.out.print("\t");
			}
			System.out.println();
		}
	}

}

  

 

   

package com.sailor.game;

/**
 * 题目:打印出所有的"水仙花数",所谓"水仙花数"是指一个三位数,其各位数字立方和等于该数本身。
 * 例如:153是一个"水仙花数",因为153=1的三次方+5的三次方+3的三次方。
 * 
 * @author Sailor
 * 
 */
public class Armstrong_number {

	public static void main(String[] args) {
		for (int i = 100; i < 1000; i++) {
			int n1, n2, n3;
			int k = i;
			n1 = k / 100;
			k %= 100;
			n2 = k / 10;
			k %= 10;
			n3 = k;
			if (i == (getCube(n1) + getCube(n2) + getCube(n3))) {
				System.out.println(i);
			}
		}
	}

	public static int getCube(int n) {
		return n * n * n;
	}

}

 

  

   

package com.sailor.game;

import java.util.Scanner;

/**
 * 题目:输入两个正整数m和n,求其最大公约数和最小公倍数。 程序分析:利用辗除法。
 * 
 * 用辗转相除法求两个数的最大公约数的步骤如下: 先用小的一个数除大的一个数,得第一个余数; 再用第一个余数除小的一个数,得第二个余数;
 * 又用第二个余数除第一个余数,得第三个余数;
 * 这样逐次用后一个数去除前一个余数,直到余数是0为止。那么,最后一个除数就是所求的最大公约数(如果最后的除数是1,那么原来的两个数是互质数)。
 * 最小公倍数为两个数相乘然后除以最大公约数
 * 
 * @author sailor
 * 
 */
public class Common_Divisor {

	public static void main(String[] args) {
		Scanner in=new Scanner(System.in);
        System.out.println("请输入第一个数");
	    int a=in.nextInt();
	    System.out.println("请输入第二个数");
	    int b=in.nextInt();
	    System.out.println(a+"和"+b+"的最大公约数是"+getMaxCommon_Divisor(a, b));
	    System.out.println(a+"和"+b+"的最小公倍数是"+getMincommon_multiple(a, b));
	}

	// 求最大公约数
	public static int getMaxCommon_Divisor(int a, int b) {
		int max = Math.max(a, b);
		int min = Math.min(a, b);
		int mod = max % min;
		if (mod == 0) {
			return min;
		} else {
			return getMaxCommon_Divisor(mod, min);
		}
	}

	// 求最大公约数
	public static int getMincommon_multiple(int a, int b) {
		return (a * b) / getMaxCommon_Divisor(a, b);
	}

}

 

 

  

package com.sailor.game;

import java.util.Scanner;

/**
 * 题目:输入某年某月某日,判断这一天是这一年的第几天?
 * 程序分析:以3月5日为例,应该先把前两个月的加起来,然后再加上5天即本年的第几天,
 * 特殊情况,闰年且输入月份大于3时需考虑多加一天。
 * 
 * @author Sailor
 * 
 */
public class Compute_Day {

	public static void main(String[] args) {

		Scanner in = new Scanner(System.in);
		System.out.println("请依次输入年、月、日:");
		int year = in.nextInt();
		int month = in.nextInt();
		int day = in.nextInt();
		int days = 0;
		boolean isLeap = isLeap(year);
		for (int i = 1; i < month; i++) {
			days += getDays(i, isLeap);
		}
		System.out.println("这是今年的第 " + (days + day) + " 天 ");
	}

	public static int getDays(int month, boolean isLeap) {
		int days = 0;
		switch (month) {
		case 1:
		case 3:
		case 5:
		case 7:
		case 8:
		case 10:
		case 12:
			days = 31;
			break;
		case 4:
		case 6:
		case 9:
		case 11:
			days = 30;
			break;
		case 2:
			if (isLeap)
				days = 29;
			else
				days = 28;
			break;
		}

		return days;
	}

	/**
	 * 判断闰年的条件: 如果年份值能被4整除且不能被100整除,或者能被400整除,就是闰年,否则不是
	 * 
	 * @param year
	 * @return
	 */
	public static boolean isLeap(int year) {
		if (year % 4 == 0 && year % 100 != 0) {
			return true;
		}
		if (year % 400 == 0) {
			return true;
		}
		return false;
	}

}

 

  

package com.sailor.game;

/**
 * 题目:两个乒乓球队进行比赛,各出三人。甲队为a,b,c三人,乙队为x,y,z三人。
 * 已抽签决定比赛名单。有人向队员打听比赛的名单。a说他不和x比,c说他不和x,z比,请编程序找出三队赛手的名单。
 * 
 * @author Sailor
 * 
 */
public class GameList {

	public static void main(String[] args) {
		int a, b, c;
		int x = 1,z = 3;// y = 2,  此处y不用,只是为了方便读懂。
		String[] temp = { "x", "y", "z" };
		for (int i = 1; i <= 3; i++)
			for (int j = 1; j <= 3; j++)
				for (int k = 1; k <= 3; k++) {
					if (i != j && j != k && i != k) {
						a = i;
						b = j;
						c = k;
						if (a != x && c != x && c != z) {
							System.out.println("a--" + temp[a - 1]);
							System.out.println("b--" + temp[b - 1]);
							System.out.println("c--" + temp[c - 1]);
						}
					}
				}
	}

}

 

  

package com.sailor.game;

/**
 * 题目:海滩上有一堆桃子,五只猴子来分。第一只猴子把这堆桃子凭据分为五份,多了一个,这只猴子把多的一个扔入海中,拿走了一份。
 * 第二只猴子把剩下的桃子又平均分成五份,又多了一个,它同样把多的一个扔入海中,拿走了一份,第三、第四、第五只猴子都是这样做的,
 * 问海滩上原来最少有多少个桃子? 解:最少的情况下,第五只猴子分配时每只猴子得到一个桃子,这是第五只猴子看到的桃子是6个
 * 
 * @author Sailor
 * 
 */
public class MonkeyGetPeach {

	public static void main(String[] args) {
		System.out.println(getPeach_Num(1));
	}

	// 返回桃子总数
	public static int getPeach_Num(int index) {
		if (index == 5)
			return 6;
		if (index < 5) {
			return getPeach_Num(index + 1) * 5 + 1;
		} else
			return 0;
	}

}

 

 

package com.sailor.game;

import java.util.Scanner;

/**
 * 
 * 题目:将一个正整数分解质因数。例如:输入90,打印出90=2*3*3*5。 程序分析:对n进行分解质因数,应先找到一个最小的质数k,然后按下述步骤完成:
 * (1)如果这个质数恰等于n,则说明分解质因数的过程已经结束,打印出即可。 (2)如果n<>k,但n能被k整除,则应打印出k的值,并用n除以k的商,作为新的正整数你n,重复执行第一步。
 * (3)如果n不能被k整除,则用k+1作为k的值,重复执行第一步。
 * 
 * @author Sailor
 */
public class Prime_factor {

	public static void main(String[] args){
		
		Scanner in=new Scanner(System.in);
		System.out.println("请输入待分解因式的数字:");
		int num = in.nextInt();
		String result = num+"=";
		while (num > 1) {
			for (int i = 1; i < num;) {
				int prime = getPrime(i);
				if (num % prime == 0) {//从最小的质数开始找起
					num /= prime;
					result += prime + (num<=1 ? "" : "*");
				}else{
					i=prime;
				}
			}
		}
		System.out.println(result);
	}

	/**
	 * 返回比n大的最小质数
	 * 
	 * @param n
	 * @return
	 */
	public static int getPrime(int n) {
		int prime = 1;
		for (int i = 1 + n;; i++) {
			boolean mark = true;
			for (int j = 2; j <= Math.sqrt(i) + 1; j++) {
				if (i % j == 0 && j != i) {
					mark = false;
					break;
				}
			}
			if (mark) {
				prime = i;
				break;
			}
		}
		return prime;
	}

}

 

分享到:
评论
38 楼 yangguo 2010-09-10  
这些都是入门级的算法,连数据结构都派不上。
37 楼 java_learner_2010 2010-09-09  
   学习中
36 楼 zpsailor 2010-07-24  
zgdx521 写道
以前学习 C 语言的时候,做过挺多关于算法的题,但是后来学了 Java Web 后,很少做了, 不知学 Web 将来工作接触算法多不多.

算法只要是程序员都不可避免的要用到吧,可能java Web里面用到的不是太多。我也没接触太多的实际web项目,不过我想算法对于编程还是很重要的是吧,同时也可以改进你遇到问题时的解决方式。
35 楼 zgdx521 2010-07-24  
以前学习 C 语言的时候,做过挺多关于算法的题,但是后来学了 Java Web 后,很少做了, 不知学 Web 将来工作接触算法多不多.
34 楼 zpsailor 2010-06-08  
shanxmxj 写道
这么多的例子 回去好好学习下。

33 楼 shanxmxj 2010-06-07  
这么多的例子 回去好好学习下。
32 楼 zpsailor 2010-06-03  
xu547465458 写道
磁带存储\磁盘存储设备的,维保、销售、系统化服务商    www.storage81.com

专业从事磁带机、磁带库、磁盘阵列、信息化建设、存储系统的业务,全方位提供网络数据安全解决方案和系统集成服务。

     作为一家具有较强综合实力的公司目前主要代理如下产品:
               
                 HP公司磁带机、磁带库等存储系统增值代理;
                 IBM公司磁带机、磁带库存储系统中国代理;
                 Quantum公司存储产品最佳合作伙伴;
                 Veritas、Bakbone、备份软件代理;
                 EMC、SUN磁盘阵列产品专业代理;
                 网络视频监控服务器
                 专业磁盘存储厂商
Tel:021-62111580   62113278
Mobile:13636302561沪、13761648996、
Mail: info@storage81.com
QQ:873372631

31 楼 taote 2010-06-02  
仿佛回到大学时代呀,呵呵,继续学习了
30 楼 zpsailor 2010-06-02  
frankhanmei 写道
楼主的代码

java.util.Scanner;

需要要JDK1.5以上的环境支持。。。。。。

你还在用1.5以下的版本?
29 楼 zpsailor 2010-06-02  
<div class="quote_title">eric_kong 写道</div>
<div class="quote_div">
<div class="quote_title">orcl_zhang 写道</div>
<div class="quote_div">
<div class="quote_title">zpsailor 写道</div>
<div class="quote_div">
<div class="quote_title">kevin_wanwei 写道</div>
<div class="quote_div">我晕倒,现在还在迷恋这些程序,悲哀啊!!!!!!!!!!!!</div>
<br>哥们儿,不是迷恋这些程序,只是一些基础的东西偶尔总会接触下吧。</div>
<br>别说,计算机的最重要的地方之一就是数据结构和算法,数据结构和算法基础好的在je里数都能数出来。抛开数据结构和算法,编程就单纯成了语言了,对于很多大牛们而言,做web的不接触数据结构和算法,毫无挑战性可言。</div>
<p><span style="font-size: small;">程序 = 数据结构 + 算法。基本功不扎实,活该做一辈子的代码民工。</span></p>
<p> </p>
</div>
<p><br>   赞成!基本功很重要,我这次面试的时候深刻体会到了。写代码的其实连计算机网络和操作系统这些都要比较懂才行。</p>
28 楼 frankhanmei 2010-06-02  
楼主的代码

java.util.Scanner;

需要要JDK1.5以上的环境支持。。。。。。
27 楼 eric_kong 2010-06-02  
<div class="quote_title">orcl_zhang 写道</div>
<div class="quote_div">
<div class="quote_title">zpsailor 写道</div>
<div class="quote_div">
<div class="quote_title">kevin_wanwei 写道</div>
<div class="quote_div">我晕倒,现在还在迷恋这些程序,悲哀啊!!!!!!!!!!!!</div>
<br>哥们儿,不是迷恋这些程序,只是一些基础的东西偶尔总会接触下吧。</div>
<br>别说,计算机的最重要的地方之一就是数据结构和算法,数据结构和算法基础好的在je里数都能数出来。抛开数据结构和算法,编程就单纯成了语言了,对于很多大牛们而言,做web的不接触数据结构和算法,毫无挑战性可言。</div>
<p><span style="font-size: small;">程序 = 数据结构 + 算法。基本功不扎实,活该做一辈子的代码民工。</span></p>
<p> </p>
26 楼 orcl_zhang 2010-06-02  
zpsailor 写道
kevin_wanwei 写道
我晕倒,现在还在迷恋这些程序,悲哀啊!!!!!!!!!!!!

哥们儿,不是迷恋这些程序,只是一些基础的东西偶尔总会接触下吧。

别说,计算机的最重要的地方之一就是数据结构和算法,数据结构和算法基础好的在je里数都能数出来。抛开数据结构和算法,编程就单纯成了语言了,对于很多大牛们而言,做web的不接触数据结构和算法,毫无挑战性可言。
25 楼 zpsailor 2010-06-02  
yqklw521 写道
题目:猴子吃桃问题:猴子第一天摘下若干个桃子,当即吃了一半,还不瘾,又多吃了一个 第二天早上又将剩  
下的桃子吃掉一半,又多吃了一个。以后每天早上都吃了前一天剩下的一半零一个。到第10天早上想再吃时,见只剩下一个桃子了。求第一天共摘了多少。  
程序分析:采取逆向思维的方法,从后往前推断。

这道题我觉得如下写比较符合题目要求:
public static void main(String[] args) {
int day=10;
int number=1;
getDayNumber(day,number);
}
   public static  int getDayNumber(int day,int number){
   System.out.println("第:"+day+" 天有:"+ number+" 桃子");
   if(day==1){
   return number;
   }else{
   number=(number+1)*2;
   day=day-1;  
   getDayNumber(day, number);

   }
   return number;
   }


我代码里面前面用数组的那个方法其实就把每天的算出来了。
24 楼 yqklw521 2010-06-02  
题目:猴子吃桃问题:猴子第一天摘下若干个桃子,当即吃了一半,还不瘾,又多吃了一个 第二天早上又将剩  
下的桃子吃掉一半,又多吃了一个。以后每天早上都吃了前一天剩下的一半零一个。到第10天早上想再吃时,见只剩下一个桃子了。求第一天共摘了多少。  
程序分析:采取逆向思维的方法,从后往前推断。

这道题我觉得如下写比较符合题目要求:
public static void main(String[] args) {
int day=10;
int number=1;
getDayNumber(day,number);
}
   public static  int getDayNumber(int day,int number){
   System.out.println("第:"+day+" 天有:"+ number+" 桃子");
   if(day==1){
   return number;
   }else{
   number=(number+1)*2;
   day=day-1;  
   getDayNumber(day, number);

   }
   return number;
   }
23 楼 pudong 2010-06-02  
在大学里,学习数据结构及参加高程考试的时候,经常研究些算法,温故而知新啊
22 楼 meiowei 2010-06-02  
kevin_wanwei 写道
我晕倒,现在还在迷恋这些程序,悲哀啊!!!!!!!!!!!!
谁大学不是玩这些玩过来的?
21 楼 zpsailor 2010-06-01  
sinostone 写道
简单问题复杂化

20 楼 sinostone 2010-06-01  
简单问题复杂化
19 楼 lz12366 2010-06-01  
很好啊!我现在也在看数据结构和算法!!

相关推荐

    数据结构与问题求解Java语言版第4版

    《数据结构与问题求解Java语言版第4版》是一本深入探讨数据结构及其在问题求解中应用的专业书籍,特别关注使用Java编程语言来实现这些概念。这本教材不仅涵盖了数据结构的基础知识,还强调了如何利用这些知识来解决...

    Java经典编程源码基础例程300.zip

    Java经典编程源码例程,可以做为你的学习设计参考。 第1章 Java语言概述 1 实例001 输出“Hello World” 2 实例002 输出控制台传递的参数 2 实例003 输出由“*”组成的三角形 3 实例004 输出符号表情 5 第2章 ...

    城市遍历求解问题

    城市遍历求解问题在计算机科学中是一个经典的图论问题,通常被用来模拟旅行者试图以最有效的方式访问一系列城市。在这个Java课程设计项目中,我们可能会遇到如何使用编程技术来解决这一问题的挑战。这个问题可以被视...

    java编程经典50题.pdf

    《Java编程经典50题》是一本针对Java编程学习者的实战型资料,涵盖了从基础到进阶的各种编程问题。从提供的代码片段来看,这个PDF文件包含了一系列的Java编程练习题,涉及了不同的算法和编程技巧。以下是部分题目...

    JAVA基础编程练习题50题及经典算法90题【含源码及答案】-史上最全

    Java基础编程练习题和经典算法是提升编程技能和准备面试的关键环节。这50题的基础编程练习涵盖了Java语言的核心概念,如数据类型、控制结构、类与对象、异常处理、集合框架等,旨在帮助学习者巩固基础知识并提高编程...

    Java基于自适应遗传算法的TSP问题建模求解源代码

    Java基于自适应遗传算法的TSP问题建模求解源代码是解决旅行商问题(Traveling Salesman Problem,简称TSP)的一种编程实现。旅行商问题是一个经典的组合优化问题,其核心是寻找最短的可能路线,使得一个旅行商能够...

    JAVA基础编程练习题50题及经典算法90题【含源码及答案】

    Java是一种广泛使用的面向对象的编程语言,以其跨平台、高性能和丰富的类库而备受开发者喜爱。这份资源包含的"JAVA基础编程练习题50题及经典算法90题"是学习和提升Java技能的理想材料。以下将分别介绍这些题目可能...

    JAVA程序设计与问题解决基础篇中文完整版.pdf

    本书《JAVA程序设计与问题解决基础篇》是一部针对高等院校计算机专业本科生或研究生设计的Java程序设计经典教材。其内容覆盖了Java基础知识,包括基本类型、字符串、控制流、类和方法的定义、数组、继承等,并引入了...

    Java 动态规划求解TSP问题

    旅行商问题 (Traveling Salesman Problem, TSP) 是一个经典的组合优化问题,主要关注的是寻找一条访问一系列地点并返回出发地的最短路径。在这个问题中,旅行商需要访问的所有地点被称为“城市”,而连接这些城市的...

    动态故障树最小割序集求解java代码

    通过理解这些Java源代码,工程师可以学习如何使用编程技术来解决系统可靠性问题,从而在设计和维护复杂系统时提高安全性。同时,这个工具也可以帮助教育工作者在教学过程中更直观地展示动态故障树分析的概念。

    递归与迭代算法及其在JAVA语言中的应用.pdf

    综上所述,递归和迭代算法是程序设计中不可或缺的两种方法,它们在Java语言中的应用广泛,可以有效地帮助解决各种编程问题。通过学习和掌握这两种算法的使用,程序员可以更高效地利用Java语言,编写出高质量、性能...

    用贪心算法实现背包问题

    在计算机科学领域,背包问题是一种经典的优化问题,它涉及到如何在有限的容量限制下,从一组物品中选择最有价值的组合。贪心算法是解决这类问题的一种策略,它通过每一步选择局部最优解来期望得到全局最优解。在这个...

    JAVA实验Java语言面向对象编程基础.pdf

    Java实验Java语言面向对象编程基础 本实验报告是关于Java语言面向对象编程基础的实验,旨在掌握Java语言的基本数据类型、变量、运算符、表达式、输入输出、流程控制、面向对象编程基础等知识点。 一、实验目的 本...

    Java经典问题算法大全

    根据给定文件的信息“Java经典问题算法大全”,我们可以推断出这份资料主要涵盖了Java编程语言中的经典算法问题及其解决方案。接下来,我们将详细探讨这一主题下的关键知识点。 ### 一、基础知识回顾 在深入讨论...

    基于遗传算法的TSP问题求解算法及其系统.pdf

    遗传算法的实现通常涉及编程,文中提到了基于Java语言实现的TSP问题求解系统。 该系统设计了具体的体系结构,包括数据结构的设计(如城市信息存储、路径表示等)、算法模块的划分(如编码、解码、适应度计算、选择...

    基于Java多线程的预处理迭代并行求解器.pdf

    Java多线程是一种编程技术,允许在同一程序中同时运行多个线程,从而实现多任务处理。在多核处理器时代,合理利用多线程技术可以显著提高程序的执行效率,这对于需要处理复杂计算和大量数据的应用程序尤为重要。在...

    50道JAVA基础编程练习题全面解答

    标题《50道JAVA基础编程练习题全面解答》说明了文档的主旨在于提供Java编程语言基础层面的练习题及其详细解答,这些练习题旨在帮助学习者巩固和加深对Java基础知识的理解和应用。描述部分进一步强调了通过这些编程...

Global site tag (gtag.js) - Google Analytics