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

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

阅读更多

编程经典问题的第一部分贴出来后,一些朋友指出我的一些程序把问题复杂化了,而且给出了更简单的解法。非常感谢这些留言,使我学习到了东西。现在我再贴出今天做的几个题

package com.sailor.game;

import java.util.Scanner;

/**
 * 题目:企业发放的奖金根据利润提成。利润(I)低于或等于10万元时,奖金可提10%;利润高于10万元,
 * 低于20万元时,低于10万元的部分按10%提成,高于10万元的部分,可可提成7.5%;20万到40万之间时,
 * 高于20万元的部分,可提成5%;40万到60万之间时高于40万元的部分,可提成3%;60万到100万之间时,高于60万元的部分,
 * 可提成1.5%,高于100万元时,超过100万元的部分按1%提成,从键盘输入当月利润I,求应发放奖金总数?
 * 
 * @author Sailor
 * 
 */
public class Prize_Problem {

	public static void main(String[] args) {

		Scanner in = new Scanner(System.in);
		System.out.println("请输入这个月的利润(万元):");
		double profit = in.nextDouble();
		System.out.println("奖金为(万元):" + getPrize(profit));
	}

	public static double getPrize(double profit) {
		double temp;
		double prize = 0;
		if (profit > 100) {
			temp = profit - 100;
			prize += temp * 0.01;
			profit -= temp;
		}
		if (profit > 60) {
			temp = profit - 60;
			prize += temp * 0.015;
			profit -= temp;
		}
		if (profit > 40) {
			temp = profit - 40;
			prize += temp * 0.03;
			profit -= temp;
		}
		if (profit > 20) {
			temp = profit - 20;
			prize += temp * 0.05;
			profit -= temp;
		}
		if (profit > 10) {
			temp = profit - 10;
			prize += temp * 0.075;
			profit -= temp;
		}
		if (profit <= 10) {
			prize += profit * 0.1;
		}
		return prize;
	}
}

 

 

  

package com.sailor.game;

import java.util.Scanner;

/**
 * 题目:给一个不多于5位的正整数,要求:一、求它是几位数,二、逆序打印出各位数字。
 * 
 * @author Sailor
 */
public class Reverse_Order_Output {

	public static void main(String[] args) {
		
		Scanner in = new Scanner(System.in);
		System.out.println("请输入一个不多于五位的整数:");
		int n = in.nextInt();
		if (n > 99999 || n < 0) {
			System.out.println("输入的数不符合要求");
			System.exit(1);
		}
		System.out.println(getDigitS(n));
		System.out.println(reverse_order(n));
	}

	// 将一个不大于5位的整数的反序后的数返回
	public static int reverse_order(int n) {
		int result = 0;
		int exp = 0;// 从最高位开始累加
		for (int i = 4; i >= 0; i--) {
			int temp = (int) (n / Math.pow(10, i));
			if (temp > 0 || exp > 0) {
				result += (int) (temp * Math.pow(10, exp));
				exp++;
				n = (int) (n % Math.pow(10, i));
			}
		}
		return result;
	}

	// 获得一个不大于5位数的位数
	public static String getDigitS(int n) {
		String digits = "";
		if (n / 10000 > 0) {
			digits = "五位数";
		} else if (n / 1000 > 0) {
			digits = "四位数";
		} else if (n / 100 > 0) {
			digits = "三位数";
		} else if (n / 10 > 0) {
			digits = "二位数";
		} else {
			digits = "一位数";
		}
		return digits;
	}

}

 

 

  

package com.sailor.game;

import java.util.Scanner;

/**
 * @author Sailor
 * 
 * 题目:输入一行字符,分别统计出其中英文字母、空格、数字和其它字符的个数。
 * 
 */

public class StringCaculate {
	public static void main(String[] args) {
		System.out.println("请输入字符串:");
		Scanner in = new Scanner(System.in);
		String str = in.nextLine();
		System.out.println(getResult(str));
	}

	@SuppressWarnings("static-access")
	public static String getResult(String str) {
		int digitNum = 0;// 数字个数
		int letterNum = 0;// 字母个数
		int blankNum = 0;// 空格个数
		int otherNum = 0;// 其他符号个数

		for (int i = 0; i < str.length(); i++) {
			Character ch = new Character(str.charAt(i));
			if (ch.isDigit(ch)) {
				digitNum++;
			} else if (ch.isLetter(ch)) {
				letterNum++;
			} else if (ch.isSpaceChar(ch)) {
				blankNum++;
			} else {
				otherNum++;
			}
		}
		return str + "中\n数字个数为:" + digitNum + "\n字母个数为:" + letterNum
				+ "\n空格个数为:" + blankNum + "\n其他字符个数为: " + otherNum;
	}

}

 

 

  

package com.sailor.game;

/**
 * 题目:有一分数序列:2/1,3/2,5/3,8/5,13/8,21/13...求出这个数列的前20项之和。 程序分析:请抓住分子与分母的变化规律。
 * 
 * @author Sailor
 * 
 */
public class Sum_Problem {

	public static void main(String[] args) {
		double sum = 0;
		String formula = "";
		for (int i = 1; i <= 20; i++) {
			formula += (getFibonacci(i + 2) + "/" + getFibonacci(i + 1));
			formula += (i == 20 ? "" : "+");
			sum += getFibonacci(i + 2) / getFibonacci(i + 1);
		}
		System.out.println(formula + "=" + sum);
	}

	/**
	 * 获得斐波拉契数列的项
	 * 
	 * @param n
	 * @return
	 */
	public static int getFibonacci(int n) {
		if (n == 1 || n == 2)
			return 1;
		else
			return getFibonacci(n - 1) + getFibonacci(n - 2);
	}

}

 

 

package com.sailor.game;

import java.util.Scanner;

/**
 * 
 * @author Sailor
 * 题目:求s=a+aa+aaa+aaaa+aa...a的值,其中a是一个数字。例如2+22+222+2222+22222(此时共有5个数相加),
 * 几个数相加有键盘控制。
 * 
 */
public class Superposition {

	public static void main(String[] args) {

		int num1 = 0;
		int num2 = 0;
		long result = 0;
		Scanner in = new Scanner(System.in);
		System.out.println("请依次输入相加次数、数字");
		num1 = in.nextInt();
		num2 = in.nextInt();
		String resultStr = "";
		for (int i = 1; i <= num1; i++) {
            for(int j=0;j<i;j++){
            	resultStr+=num2;
            }
            if(i!=num1){
            	resultStr+="+";
            }
			result += (num2 * i * (Math.pow(10, num1-i)));
		}
		System.out.println(resultStr+"="+result);
	}
}

 

分享到:
评论
7 楼 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

广告打到这儿来了~~
6 楼 zpsailor 2010-06-02  
wenqxin 写道
说下最后一个题吧,可以通过递归来实现.
/**
 * @author wenqxin;
 *  递归算法实现
 */
public class Add {

	/**
	 * 获取最大的一个数值
	 *通过递归实现 
	 * @param basic     基数
	 * @param exp       相加次数
	 */
	public static double getMaxNumber(int basic, int exp) {
		if (exp < 1) {
			return 0;
		}
		else if (exp == 1) {
			return basic;
		}
		 else {
			return basic * Math.pow(10, exp - 1) + getMaxNumber(basic, exp - 1);
		}
	}

	/**
	 * 递归获取所有值相加的值
	 * 通过递归实现
	 * @param basic     基数
	 * @param exp       相加次数
	 *            
	 */
	public static double getNumAdd(int basic, int exp) {
		if (exp < 1) {
			return 0;
		} else if (exp == 1) {
			return basic;
		} else {
			return getMaxNumber(basic, exp) + getNumAdd(basic, exp - 1);
		}

	}

	public static void main(String[] args) {
		Scanner scanner = new Scanner(System.in);
		System.out.println("请输入基数");
		int b = scanner.nextInt();
		System.out.println("请输入相加次数");
		int e = scanner.nextInt();

		System.out.println("最大的一个值为: " + Add.getMaxNumber(b, e));
		System.out.println("相加后的值为:   " + Add.getNumAdd(b, e));

	}

}

     总觉得吧,这种题,如果不考虑性能和算法复杂度,就单纯的实现编码,可以有很多编写方式,意义不大.

恩,实现方式很多,而且我感觉在做Java web开发的时候接触算法的机会比较少,而且一般也不是在算法上做效率优化,而是在数据库方面做优化。不过这些算法题在面试的时候还是需要用到的。
5 楼 wenqxin 2010-06-02  
说下最后一个题吧,可以通过递归来实现.
/**
 * @author wenqxin;
 *  递归算法实现
 */
public class Add {

	/**
	 * 获取最大的一个数值
	 *通过递归实现 
	 * @param basic     基数
	 * @param exp       相加次数
	 */
	public static double getMaxNumber(int basic, int exp) {
		if (exp < 1) {
			return 0;
		}
		else if (exp == 1) {
			return basic;
		}
		 else {
			return basic * Math.pow(10, exp - 1) + getMaxNumber(basic, exp - 1);
		}
	}

	/**
	 * 递归获取所有值相加的值
	 * 通过递归实现
	 * @param basic     基数
	 * @param exp       相加次数
	 *            
	 */
	public static double getNumAdd(int basic, int exp) {
		if (exp < 1) {
			return 0;
		} else if (exp == 1) {
			return basic;
		} else {
			return getMaxNumber(basic, exp) + getNumAdd(basic, exp - 1);
		}

	}

	public static void main(String[] args) {
		Scanner scanner = new Scanner(System.in);
		System.out.println("请输入基数");
		int b = scanner.nextInt();
		System.out.println("请输入相加次数");
		int e = scanner.nextInt();

		System.out.println("最大的一个值为: " + Add.getMaxNumber(b, e));
		System.out.println("相加后的值为:   " + Add.getNumAdd(b, e));

	}

}

     总觉得吧,这种题,如果不考虑性能和算法复杂度,就单纯的实现编码,可以有很多编写方式,意义不大.
4 楼 zpsailor 2010-06-02  
orcl_zhang 写道
恩,这样挺好。等待楼主的系列作品。最好把负责度的分析也写上。
哪个大牛可以出一贴,专门讨论如何计算算法复杂度的,评价算法优劣的帖子。
估计很多同学都不了解,这些时间负责度O(nlogn)类似的是如何计算出来的。
投个良好,鼓励下。

呵呵,算法复杂度这个度量方法我不是很清楚啊,当时学算法课的时候这个就让我很头痛~~
3 楼 orcl_zhang 2010-06-02  
恩,这样挺好。等待楼主的系列作品。最好把负责度的分析也写上。
哪个大牛可以出一贴,专门讨论如何计算算法复杂度的,评价算法优劣的帖子。
估计很多同学都不了解,这些时间负责度O(nlogn)类似的是如何计算出来的。
投个良好,鼓励下。
2 楼 zpsailor 2010-06-02  
<div class="quote_title">helin 写道</div>
<div class="quote_div">
<p>第二题:求输入数字长度:</p>
<p> new String(src).length();</p>
<p>逆序输出:</p>
<p>new StringBuffer(src).reverse();</p>
</div>
<p><br>确实,将输入数字当成字符串来处理简单多了,谢谢了!</p>
1 楼 helin 2010-06-01  
<p>第二题:求输入数字长度:</p>
<p> new String(src).length();</p>
<p>逆序输出:</p>
<p>new StringBuffer(src).reverse();</p>

相关推荐

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

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

    JAVA面向过程的程序设计

    1. 面向过程的程序设计 面向过程——面向机器 –其中心思想是用计算机能够理解的逻辑来描述和表达待解决的问题及其具体的解决过程。–算法+数据结构 l数据结构利用计算机的离散逻辑来量化表达需要解决的问题。 l –...

    C++数据抽象和问题求解(第6版).[美]Frank M. Carrano(带详细书签).pdf

    第5章 作为问题求解技术的递归 155 5.1 定义语言 156 5.1.1 语法知识基础 156 5.1.2 两种简单的语言 158 5.2 代数表达式 160 5.2.1 代数表达式的类型 160 5.2.2 前缀表达式 162 5.2.3 后缀表达式 166 5.2.4 ...

    数据结构与算法分析_Java语言描述(第2版)]

    Java语言描述(第2版)》是国外数据结构与算法分析方面的经典教材,使用卓越的Java编程语言作为实现工具讨论了数据结构(组织大量数据的方法)和算法分析(对算法运行时间的估计)。随着计算机速度的不断增加和功能...

    VC与Labview、Matlab编程论文资料[2].rar

    基于ActiveX引擎的VC_与Matlab混合编程及其应用.pdf 基于ARM7和VC平台的高分辨率红外触摸屏设计.pdf 基于AT89C52与MFC的电阻率分布监测系统.pdf 基于COM_VC_Word技术的产品设计说明书自动化研究.pdf 基于COM组件的...

    数据结构与算法分析_Java语言描述(第2版)

    《数据结构与算法分析:Java语言描述(第2版)》是国外数据结构与算法分析方面的经典教材,使用卓越的Java编程语言作为实现工具讨论了数据结构(组织大量数据的方法)和算法分析(对算法运行时间的估计)。...

    数据结构与算法分析 Java语言描述第2版

    内容简介《数据结构与算法分析:Java语言描述(第2版)》是国外数据结构与算法分析方面的经典教材,使用卓越的Java编程语言作为实现工具讨论了数据结构(组织大量数据的方法)和算法分析(对算法运行时间的估计)。...

    非线性系统手册原书第5版混沌,分形,元胞自动机,遗传算法,基因表达式编程,支持向量机,小波,隐马尔可夫模型,模糊逻辑与C 、JAVA和SymbolicC 程序

    非线性系统手册 第五版:混沌,分形,元胞自动机,遗传算法,基因表达式编程,支持向量机,小波,隐马尔可夫模型,模糊逻辑与C++、JAVA和SymbolicC++程序 出版时间:2013年版 内容简介  《非线性系统手册(第5版)...

    VC与Labview、Matlab编程论文资料

    基于ActiveX引擎的VC_与Matlab混合编程及其应用.pdf 基于ARM7和VC平台的高分辨率红外触摸屏设计.pdf 基于AT89C52与MFC的电阻率分布监测系统.pdf 基于COM_VC_Word技术的产品设计说明书自动化研究.pdf 基于COM组件的...

    VC与Labview、Matlab编程论文资料[4].rar

    基于ActiveX引擎的VC_与Matlab混合编程及其应用.pdf 基于ARM7和VC平台的高分辨率红外触摸屏设计.pdf 基于AT89C52与MFC的电阻率分布监测系统.pdf 基于COM_VC_Word技术的产品设计说明书自动化研究.pdf 基于COM组件的...

    JAVA程序设计教程

    第二章基本数据类型 .........................................................................................................14 §2.1 数据类型概述 ......................................................

    Oracle SQL高级编程(资深Oracle专家力作,OakTable团队推荐)--随书源代码

    Karen Morton及其团队在本书中提供了专业的方案:先掌握语言特性,再学习Oracle为提升语言效率而加入的支持特性,进而将两者综合考虑并在工作中加以应用。作者通过总结各自多年的软件开发和教学培训经验,与大家...

    算法导论(part2)

    因为书中讨论了算法设计中的工程问题及其数学性质,因此,本书也可以供专业技术人员自学之用。 本书是第2版。在这个版本里,我们对全书进行了更新。所做的改动从新增了若干章,到个别语句的改写。 致使用本书的...

    蔡氏方程matlab求解代码-spring-boot-learning::four_leaf_clover:指导有关SpringBoot,SpringCloud越南语示例代码

    Boot及其相关的所有内容,都可以在这里搜索。 每个模块都有详细的说明。 :eggplant: :banana: | | 为什么要学习Java? 来源: 在讨论Spring Boot之前,让我们谈谈它的基础Java 。 Java诞生于1991年,到目前为止已经...

    Linux多线程服务端编程:使用muduo C++网络库

    《Linux多线程服务端编程:使用muduo C++网络库》主要讲述采用现代C++在x86-64 Linux上编写多线程TCP网络服务程序的主流常规技术,重点讲解一种适应性较强的多线程服务器的编程模型,即one loop per thread。...

    计算机科学与技术学院毕业设计(论文)开题报告

    计算机科学与技术学院毕业设计(论文)开题报告 一、选题的研究目的和意义 随着社会经济不断发展,人们的精神压力也越来越大,适时的放松心情... 数据抽象和问题求解——JAVA 语言描述. 清华大学出版社 2005 年 4 月.

    算法导论(part1)

    因为书中讨论了算法设计中的工程问题及其数学性质,因此,本书也可以供专业技术人员自学之用。 本书是第2版。在这个版本里,我们对全书进行了更新。所做的改动从新增了若干章,到个别语句的改写。 致使用本书的...

    计算机专业相关课程描述.docx

    掌握复杂数据结构在计算机中的存储表示及其运算,建立正确的数据组织与数据处理的设计思想,培养学生综合运用数据结构课程的相关设计理论与实际问题相结合解决数据组织与分析、数据处理与算法设计等设计问题的能力。...

Global site tag (gtag.js) - Google Analytics