`

几个笔试题目(2010-09-18)

    博客分类:
  • Java
阅读更多

感谢大家,一些问题经过大家讨论变得很明朗。谢谢!对大家一些回复进行了一个小结,大家可以点击此处查看。

 

今天去一家公司参加笔试,其中有几个题目觉得做的不是太好,拿出来与大家讨论。

1、智力题

题目大概意思是:有10箱罐头,每箱20瓶,每瓶重800克。其中有一箱每瓶都少50克,现在有一个自动秤,需要一个硬币才能秤,现在你只有一个硬币也就是只能称量一次,问如何找出每瓶少50克的那一箱?

这个题目想了半天也不知道如何答,结果留空了。
xanpeng 写道
第一题思路:第一个箱子取1瓶,第二个取2瓶,。。。,第10箱取10瓶
如果那箱没有少50克,则总共重800*(1+2+...+10) = 44000
实际有一箱每瓶是少50克的,实际称出重量y克
则有 44000 - y = x*50, x 就是第 x 个箱子,就是目标箱子

polaris注: 当时没考虑拆箱拿出来。因为题目上说是一个工厂的人给一个公司送的10箱罐头,返回时,他老板打电话给他,说有一箱有问题,要他挑出来,我觉得是包装好了的,拆开不太行吧,都拆开,公司不愿意吧,所以觉得题目是不是有问题,没法解。看来还是得拆开。

2、基础题

2.1 在一个平面中画999条线,最多可以分为多少部分。写出推导公式。

见到此题的第一想法是:利用数学中的归纳法,根据1、2、3、4等条线时可分出的数量推导出公式。然而,这种方法证明比较麻烦。然后就想其他方法,当然就是找规律了,想到的是根据交点数来计算,不过这种方法试了一下,发现有点难度,似乎不可行。最后想来想去还是使用了归纳法,毕竟来的容易,只是没有写证明过程。

2.2 什么是软件生命周期?有哪几个阶段?

当时学软件工程的时候都记着的,这时候一下子忘记了。就胡乱写了几个。不过也大概对了。这样的题目感觉没多大意思,完全记忆性的。

该题的答案(供参考):

软件生命周期(SDLC,软件生存周期)是软件的产生直到报废的生命周期,周期内有问题定义、可行性分析、总体描述、系统设计、编码、调试和测试、验收与运行、维护升级到废弃等阶段,这种按时间分程的思想方法是软件工程中的一种思想原则,即按部就班、逐步推进,每个阶段都要有定义、工作、审查、形成文档以供交流或备查,以提高软件的质量。

软件生命周期(SDLC)的六个阶段

(1)问题的定义及规划。
此阶段是软件开发方与需求方共同讨论,主要确定软件的开发目标及其可行性。

(2)需求分析。
在确定软件开发可行的情况下,对软件需要实现的各个功能进行详细分析。需求分析阶段是一个很重要的阶段,这一阶段做得好,将为整个软件开发项目的成功打下良好的基础。"唯一不变的是变化本身",同样需求也是在整个软件开发过程中不断变化和深入的,因此我们必须制定需求变更计划来应付这种变化,以保护整个项目的顺利进行。

(3)软件设计。
此阶段主要根据需求分析的结果,对整个软件系统进行设计,如系统框架设计,数据库设计等等。软件设计一般分为总体设计和详细设计。好的软件设计将为软件程序编写打下良好的基础。

(4)程序编码。
此阶段是将软件设计的结果转换成计算机可运行的程序代码。在程序编码中必须要制定统一,符合标准的编写规范。以保证程序的可读性,易维护性,提高程序的运行效率。

(5)软件测试。
在软件设计完成后要经过严密的测试,以发现软件在整个设计过程中存在的问题并加以纠正。整个测试过程分单元测试、组装测试以及系统测试三个阶段进行。测试的方法主要有白盒测试和黑盒测试两种。在测试过程中需要建立详细的测试计划并严格按照测试计划进行测试,以减少测试的随意性。

(6)运行维护。
软件维护是软件生命周期中持续时间最长的阶段。在软件开发完成并投入使用后,由于多方面的原因,软件不能继续适应用户的要求。要延续软件的使用寿命,就必须对软件进行维护。软件的维护包括纠错性维护和改进性维护两个方面。 

3、编程题

题目: 将正整数的阿拉伯钱数转换为中文形式,如1011→一千零一十一,输出。

题目要求最好编程实现,不会编程可以用文字说明。

这道题并不难,算法思路很多人应该都会,然而,要真正编程实现,且是用笔写出来,要做到很准确就有点难度。

polaris解该题的大概思路是:确定正整数的总位数,然后分别用10的多少次方去除和取模,取模的结果再进行除与取模。

这里面涉及到很多细节要考虑,比如:多个连续的0,亿、万位的零等。

下面是polaris回来在电脑上编写了一个完整的,写的不对或不好之处,请大家指正。大家有更好的可以拿出来一起讨论。

package com.polaris.test;


/**
 * 将正整数的阿拉伯钱数转换为中文形式,如1011→一千零一十一,输出。
 * @author xuxinhua(polaris) http://www.beijixing001.com



 * 2010-09-18
 * @version 1.0
 */
public class TranslateMoney { 
        // 保存阿拉伯数字到中文的对应关系
        private static String[] chineseMapStr = {"零","一","二","三","四","五","六","七","八","九"}; 
        
        // 保存最后的输出结果
	private static StringBuilder chinMoney = new StringBuilder();
	
	// 多个0连续时,中文只需写出一个零。该变量用于标记是否为连续的0
	private static int flag = 0;
	
	public static void main(String[] args) throws Exception{
		// 省略
	}
	
	/**
	 * 转换函数
	 * @param money
	 * @param digit
	 * @return
	 */
	public static String translate(int money, int digit) {
		
		if(digit==1) {
			// 如果个位是0,则忽略
			if(money!=0){
				// 得到数字的中文表示
				String chinDigit = chineseMapStr[money];
				chinMoney.append(chinDigit);
			}
		} else {
			
			// 除数
			int divisor = (int)Math.pow(10, digit-1);
			// 商
			int quotient = money / divisor;
			// 余数
			int remainder =	money % divisor;
			
			// 得到数字的中文表示
			String chinDigit = chineseMapStr[quotient];
			
			// 得到当前最高位的中文表示
			String unit = "";
			
			if(quotient!=0) {
				// 得到当前最高位的中文表示
				unit = getUnit(digit);
				flag = 0;
			} else {
				// 如果亿、万为零,须特殊处理,零不说出,而保留亿或万,这时flag增加
				if(digit==9 || digit==5) {
					chinDigit = "";
					unit = getUnit(digit);
				} else {
					++flag;
				}
			}
			
			// 不止一个0
			if(flag>1) {
				// 忽略该位,处理下一位
				translate(remainder, digit-1);
			} else {
				// 如果是一十亿、一十万之类的,前面的“一”不要,这样更符合中文习惯
				if(quotient==1) {
					if(digit==6 || digit==10)
						chinDigit = "";
				}
				chinMoney.append(chinDigit).append(unit);
				translate(remainder, digit-1);
			}
		}
		
		return chinMoney.toString();
	}

	/**
	 * 位数表示,如亿、万等
	 * @param digit
	 * @return
	 */
	private static String getUnit(int digit) {
		String unit = null;
		
		switch(digit) {
		case 12:
		case 8:
		case 4:
			unit = "千";
			break;
		case 11:
		case 7:
		case 3:
			unit = "百";
			break;
		case 10:
		case 6:
		case 2:
			unit = "十";
			break;
		case 9:
			unit = "亿";
			break;
		case 5:
			unit = "万";
			break;
		}
		
		return unit;
	}
}
 下载完整的类文件:TranslateMoney.java (在文章最后)
分享到:
评论
69 楼 Roshan2 2010-09-24  
http://www.iteye.com/topic/770328
68 楼 g岩岩 2010-09-24  
有难度呀!!!!!!!!
67 楼 yearh 2010-09-24  
用了递归解也行
public class Test {
	
	private static String[] digit = { "一", "二", "三", "四", "五", "六", "七", "八", "九", "十" };
	private static String[] unit = { "十", "百", "千", "万", "十", "百", "千", "亿", "十", "百", 
			"千", "万", "兆", "十", "百", "千", "万", "亿" };

	private static String convertInner(String money) {
		int length = money.length();
		int curNum = money.charAt(0) - '0';
		String result = "";
		if (length > 1) {
			String curUnit = unit[length - 2];
			result = convertInner(money.substring(1, length));
			if (curNum == 0) {
				if (money.charAt(1) != '0' && "万亿兆".indexOf(curUnit) == -1)
					result = "零" + result;
				else if ("万亿兆".indexOf(curUnit) != -1)
					result = curUnit + result;
			} else
				result = digit[curNum - 1] + curUnit + result;
		} else if (curNum != 0)
			result = digit[curNum - 1];
		return result;
	}

	public static String convert(String money) {
		String result = convertInner(money).replaceAll("亿万", "亿").replaceAll("兆万", "兆")
				.replaceAll("兆亿", "兆").replaceAll("一十", "十");
		return result.equals("") ? "零" : result;
	}

	public static void main(String[] args) {
		String result = "";
		String[] money = { "900000000020300" };
		String[] rightResult = { "九十兆零二万零三百" };
		for (int i = 0; i < money.length; i++) {
			result = convert(money[i]);
			System.out.println("[" + result.equals(rightResult[i]) + "] money = " + money[i]
					+ ", result = " + result);
		}
	}
}


66 楼 Wade_songww 2010-09-23  
那个编程题没看明白 有人帮忙解释下么?
65 楼 manyhf16 2010-09-21  
利用中午的时间写了一下,主要使用了正则表达式和BigDecimal中一些方法,效率没有考虑,但自认为代码还是比较易懂的. 大家帮忙检查下,看有没有问题
import java.math.BigDecimal;

public class TestMoney {
	public static final String[] ms = {"零","壹","贰","叁","肆","伍","陆","柒","捌","玖"};
	public static final String[] ds = {"圆","拾", "佰", "仟", "万", "拾", "佰", "仟", "亿","拾", "佰", "仟", "兆","拾", "佰", "仟"};
	public static final String[] xs = {"角","分"};	

	/**
	 * 
	 * @param money 考虑到整数太小,使用了BigDecimal,本来字符串也可以,但懒的再改了
	 * @param useZhao 是否以兆为单位,true 表示单位为'兆' false表示'兆'将以'万亿'表示
	 * @return
	 */
	public static String convert(BigDecimal money, boolean useZhao) {
		// 转换小数部分
		BigDecimal xiao = money.subtract(money.setScale(0,BigDecimal.ROUND_DOWN));
		boolean isXiao = !xiao.equals(BigDecimal.ZERO);
		StringBuilder sb3 = new StringBuilder();
		String xiaoStr = "";
		if(isXiao) {
			int i = 0;
			do {
				xiao = xiao.multiply(BigDecimal.TEN);				
				sb3.append(ms[xiao.setScale(0, BigDecimal.ROUND_DOWN).intValue()]);
				sb3.append(xs[i]);
				i++;
				xiao = xiao.subtract(xiao.setScale(0,BigDecimal.ROUND_DOWN));
			} while(i < xs.length);
			xiaoStr = sb3.toString()
				.replaceAll("(零[^角分])+", "零")
				.replaceAll("(零[角分])+$", "");
		}
		
		// 转换整数部分
		StringBuilder sb1 = new StringBuilder();		
		do {
			BigDecimal[] s = money.divideAndRemainder(BigDecimal.TEN);
			sb1.append(ms[s[1].intValue()]);
			money = s[0];
		} while(money.compareTo(BigDecimal.ZERO) > 0);
		StringBuilder sb2 = new StringBuilder();
		for (int i = 0; i < sb1.length(); i++) {
			sb2.append(ds[i]).append(sb1.charAt(i));
		}
		String tmp = sb2.reverse()
			.append((xiaoStr.length()>0)?xiaoStr:"整")
			//中间有'零佰','零仟'的都替换为'零'
			.toString().replaceAll("(零[^亿万圆])+", "零") 	
			//中间有'零亿', '零零亿','零零万','零零元'的都替换掉零,不包括兆|亿|万|圆
			//等价于下面注释的四句
			.replaceAll("(零+)(?=兆|亿|万|圆)", "")	
//			.replaceAll("零+兆", "兆")
//			.replaceAll("零+亿", "亿")
//			.replaceAll("零+万", "万")
//			.replaceAll("零+圆", "圆")
			.replaceAll("亿万", "亿")
			.replaceAll("兆亿", "兆")
			.replaceAll("壹拾", "拾") ; // 按楼主说的,更符合习惯
		tmp = (useZhao)?tmp:tmp.replaceAll("兆", "万亿");
		System.out.println(tmp);
		return tmp;
	}
	
	public static void main(String[] args) {

		TestMoney.convert(new BigDecimal("1020.02"),true);
		TestMoney.convert(new BigDecimal("1020.00"),true);
		TestMoney.convert(new BigDecimal("1020.30"),true);
		TestMoney.convert(new BigDecimal("1020.44"),true);
		TestMoney.convert(new BigDecimal("109000"),true);
		TestMoney.convert(new BigDecimal("1234123456789"),true);
		TestMoney.convert(new BigDecimal("1234123456789"),false);
		TestMoney.convert(new BigDecimal("1010000100010"),true);
		TestMoney.convert(new BigDecimal("1010000100010"),false);
		TestMoney.convert(new BigDecimal("1000000000000"),true);
		TestMoney.convert(new BigDecimal("1000000000000"),false);
		TestMoney.convert(new BigDecimal("903003000000000"),false);
		TestMoney.convert(new BigDecimal("903003000000000"),true);
		
		
		
	}

}

64 楼 yangguo 2010-09-21  
polaris1119 写道


呵呵。看样子还是我那种最古老的实现方式比较可靠。呵呵。
200000000这么多0还真没有考虑到。呵呵。


你的比较低效,也不好扩展的。

扩展到更高位就体现出优势了。

package com.test;

public class MoneyTrans {
	
	private static String[] ChinaDigit = {"零","一","二","三","四","五","六","七","八","九"};
	private static String[] UNIT = {"","","十","百","千"};
	private static String[] BIGUNIT = {"","万","亿","兆"};
	private static long MAX = 10000000000000000L - 1;
	private char[] digit;
	public String trans(long n) throws Exception{
		if(n > MAX){
			throw new Exception("数字过大,最多可处理到千兆位");
		}
		StringBuffer buff = new StringBuffer();
		boolean isPrePartZero = false;
		digit = String.valueOf(n).toCharArray();
		int length = digit.length;		
		int pos = (length - 1)/4;
		int headLength = (length - 1)%4 + 1;	
		//  xxxxxxxxxx -->  xx|xxxx|xxxx
		buff.append(partTrans(0,headLength) + BIGUNIT[pos--]);
		for (int i = headLength;i < length ; i = i + 4) {
			String part = partTrans(i , i + 4);
			if(part.length() == 0){
				isPrePartZero = true;
			}else{
				if(isPrePartZero && !part.startsWith(ChinaDigit[0])){
					buff.append(ChinaDigit[0]);
				}
				buff.append(part +  BIGUNIT[pos]) ;
				isPrePartZero = false;
			}
			pos--;
		}
		return buff.toString();
	}
	
	private  String partTrans(int start, int end) {
		StringBuffer buff = new StringBuffer();
		boolean isPreDigitZero = false;
		for (int i = start; i < end; i++) {
			int cur = digit[i] - '0';
			if(cur != 0 ){
				if(isPreDigitZero){
					buff.append(ChinaDigit[0]);
				}
				buff.append(ChinaDigit[cur] + UNIT[end - i]);
				isPreDigitZero = false;
			}
			else {			
				isPreDigitZero = true;
			}			
		}		
		return buff.toString();		
	}

	public static void main(String[] args) throws Exception {		
		MoneyTrans transtor = new MoneyTrans();    
		String test1 = transtor.trans(9000000000000000L);
		String test2 = transtor.trans(9000000000000001L);
		System.out.println(test1);
		System.out.println(test2);
	}

}




63 楼 polaris1119 2010-09-21  
a881127b 写道
你钱数转换为中文的程序有个很大的错误:
你的标记Flag用的static变量,要是程序中多次调用这个转换类的话怎么办??

一个测试用例:
public static void main(String[] args) throws Exception{  
        // 省略  
    	System.out.println(translate(1234,4));
    	System.out.println(translate(1234,4));
    }  


结果:
一千二百三十四
一千二百三十四一千二百三十四

哦,谢谢提醒,写的时候没有考虑这种问题,还有多线程问题也没有考虑,当时只考虑实现功能。
62 楼 polaris1119 2010-09-21  
yangguo 写道
针对你提的bug,修正如下:
public String trans(int n){
		StringBuffer buff = new StringBuffer();
		boolean isPrePartZero = false;
		digit = String.valueOf(n).toCharArray();
		int length = digit.length;		
		int pos = (length - 1)/4;
		int headLength = (length - 1)%4 + 1;	
		//  xxxxxxxxxx -->  xx|xxxx|xxxx
		buff.append(partTrans(0,headLength) + BIGUNIT[pos--]);
		for (int i = headLength;i < length ; i = i + 4) {
			String part = partTrans(i , i + 4);
			if(part.length() == 0){
				isPrePartZero = true;
			}else{
				if(isPrePartZero && !part.startsWith(ChinaDigit[0])){
					buff.append(ChinaDigit[0]);
				}
				buff.append(part +  BIGUNIT[pos]) ;
				isPrePartZero = false;
			}
			pos--;
		}
		return buff.toString();
	}



你改的方案过不了: 200000000


呵呵。看样子还是我那种最古老的实现方式比较可靠。呵呵。
200000000这么多0还真没有考虑到。呵呵。
61 楼 polaris1119 2010-09-21  
夜如此的寒 写道
根据楼主的需求,加了个判断:

public class Test {

	public static String translateMoney(int money) {
		String total = "";//返回的字符串
		String[] Money = { "零", "一", "二", "三", "四", "五", "六", "七", "八", "九"};
		String[] Util = {" ","十", "百", "千", "万", "十", "百", "千", "亿"};
		String strMoney = String.valueOf(money);//参数转字符串
		String[] inMoney =strMoney.toString().trim().split("");//参数转存到数组里
		for(int i=0;i<strMoney.length();i++){
			if(Integer.parseInt(inMoney[1+i])==0){
				total=total+Money[Integer.parseInt(inMoney[1+i])];
			}else{
				total=total+Money[Integer.parseInt(inMoney[1+i])]+Util[strMoney.length()-i-1];
			}
		}
                total = total.toString().trim();
		return total;
	}

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

}


输出结果:一百零二万三千二百零一


兄弟,你这个不行啊。考虑问题要周到些。呵呵。多个0在一起呢?比如10023201,测试又有问题了,结果输出:一千零零二万三千二百零一
60 楼 夜如此的寒 2010-09-21  
根据楼主的需求,加了个判断:

public class Test {

	public static String translateMoney(int money) {
		String total = "";//返回的字符串
		String[] Money = { "零", "一", "二", "三", "四", "五", "六", "七", "八", "九"};
		String[] Util = {" ","十", "百", "千", "万", "十", "百", "千", "亿"};
		String strMoney = String.valueOf(money);//参数转字符串
		String[] inMoney =strMoney.toString().trim().split("");//参数转存到数组里
		boolean  flg = true;
		for(int i=0;i<strMoney.length();i++){
			if(Integer.parseInt(inMoney[1+i])==0){
				if(flg){
				total=total+Money[Integer.parseInt(inMoney[1+i])];
				flg = false;
				}
			}else{
				total=total+Money[Integer.parseInt(inMoney[1+i])]+Util[strMoney.length()-i-1];
				flg = true;
			}
		}
		total = total.toString().trim();
		return total;
	}

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

}


输出结果:一亿零二万三千二百零一

继续修改

59 楼 a881127b 2010-09-21  
你钱数转换为中文的程序有个很大的错误:
你的标记Flag用的static变量,要是程序中多次调用这个转换类的话怎么办??

一个测试用例:
public static void main(String[] args) throws Exception{  
        // 省略  
    	System.out.println(translate(1234,4));
    	System.out.println(translate(1234,4));
    }  


结果:
一千二百三十四
一千二百三十四一千二百三十四
58 楼 yangguo 2010-09-21  
针对你提的bug,修正如下:
public String trans(int n){
		StringBuffer buff = new StringBuffer();
		boolean isPrePartZero = false;
		digit = String.valueOf(n).toCharArray();
		int length = digit.length;		
		int pos = (length - 1)/4;
		int headLength = (length - 1)%4 + 1;	
		//  xxxxxxxxxx -->  xx|xxxx|xxxx
		buff.append(partTrans(0,headLength) + BIGUNIT[pos--]);
		for (int i = headLength;i < length ; i = i + 4) {
			String part = partTrans(i , i + 4);
			if(part.length() == 0){
				isPrePartZero = true;
			}else{
				if(isPrePartZero && !part.startsWith(ChinaDigit[0])){
					buff.append(ChinaDigit[0]);
				}
				buff.append(part +  BIGUNIT[pos]) ;
				isPrePartZero = false;
			}
			pos--;
		}
		return buff.toString();
	}



你改的方案过不了: 200000000
57 楼 polaris1119 2010-09-20  
夜如此的寒 写道
小弟献丑了:20行代码。粗粗的写了一下。。别骂我

public class Test {

	public static String translateMoney(int money) {
		String total = "";//返回的字符串
		String[] Money = { "零", "一", "二", "三", "四", "五", "六", "七", "八", "九"};
		String[] Util = { " ","十", "百", "千", "万", "十", "百", "千", "亿"};
		String strMoney = String.valueOf(money);//参数转字符串
		String[] inMoney =strMoney.toString().trim().split("");//参数转存到数组里
		for(int i=0;i<strMoney.length();i++){
			total=total+Money[Integer.parseInt(inMoney[1+i])]+Util[strMoney.length()-i-1];
		}
		return total;
	}

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

}


运行结果:九亿九千九百九十九万九千九百九十九


呵呵。你这个太粗糙了。测试用例更粗糙。这个主要要考虑0的问题,测试数字中一个0也没有。我随便拿一个带0的就出问题了。1023201,输出:一百零十二万三千二百零十一
56 楼 konnin 2010-09-20  
luobin23628 写道



public class NumberToChinese {

	private static final String[] genericUnit = {"","十","百","千","万","十","百","千","亿","十","百","千","兆","十兆","百兆","千兆"};    
	private static final String[] numberic = {"零","一","二","三","四","五","六","七","八","九"};
	
	public static String tranform(String number){
		StringBuffer buffer = new StringBuffer();
		
		int len = number.length();
		
		for(int i=0; i<len; i++){
			int n = Integer.parseInt(number.substring(i,i+1));
			if(n==0){
				if(!buffer.toString().endsWith(numberic[0])){
					buffer.append(numberic[n]);
				}
			}else{
				buffer.append(numberic[n]);
				buffer.append(genericUnit[len-i-1]);
			}
		}
		
		return normalize(buffer.toString());
		
	}
	
	private static String normalize(String s){
		return s.replaceAll("^"+numberic[0]+"*(.*?)"+numberic[0]+"*$", "$1");
	}
	
	
	public static void main(String[] args) {
		
		System.out.println(tranform("0006560000000"));;
		
	}
	
	
}

这个还是有点问题哦,比如用800098测试,结果却是八十零九十八,我还在研究,呵呵,刚刚看到
55 楼 夜如此的寒 2010-09-20  
小弟献丑了:20行代码。粗粗的写了一下。。别骂我

public class Test {

	public static String translateMoney(int money) {
		String total = "";//返回的字符串
		String[] Money = { "零", "一", "二", "三", "四", "五", "六", "七", "八", "九"};
		String[] Util = { " ","十", "百", "千", "万", "十", "百", "千", "亿"};
		String strMoney = String.valueOf(money);//参数转字符串
		String[] inMoney =strMoney.toString().trim().split("");//参数转存到数组里
		for(int i=0;i<strMoney.length();i++){
			total=total+Money[Integer.parseInt(inMoney[1+i])]+Util[strMoney.length()-i-1];
		}
		return total;
	}

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

}


运行结果:九亿九千九百九十九万九千九百九十九
54 楼 luobin23628 2010-09-20  



public class NumberToChinese {

	private static final String[] genericUnit = {"","十","百","千","万","十","百","千","亿","十","百","千","兆","十兆","百兆","千兆"};    
	private static final String[] numberic = {"零","一","二","三","四","五","六","七","八","九"};
	
	public static String tranform(String number){
		StringBuffer buffer = new StringBuffer();
		
		int len = number.length();
		
		for(int i=0; i<len; i++){
			int n = Integer.parseInt(number.substring(i,i+1));
			if(n==0){
				if(!buffer.toString().endsWith(numberic[0])){
					buffer.append(numberic[n]);
				}
			}else{
				buffer.append(numberic[n]);
				buffer.append(genericUnit[len-i-1]);
			}
		}
		
		return normalize(buffer.toString());
		
	}
	
	private static String normalize(String s){
		return s.replaceAll("^"+numberic[0]+"*(.*?)"+numberic[0]+"*$", "$1");
	}
	
	
	public static void main(String[] args) {
		
		System.out.println(tranform("0006560000000"));;
		
	}
	
	
}
53 楼 luobin23628 2010-09-20  




public class NumberToChinese {

private static final String[] genericUnit = {"","十","百","千","万","十","百","千","亿","十","百","千","兆","十兆","百兆","千兆"};   
private static final String[] numberic = {"零","一","二","三","四","五","六","七","八","九"};

public static String tranform(String number){
StringBuffer buffer = new StringBuffer();

int len = number.length();

for(int i=0; i<len; i++){
int n = Integer.parseInt(number.substring(i,i+1));
if(n==0){
if(!buffer.toString().endsWith(numberic[0])){
buffer.append(numberic[n]);
}
}else{
buffer.append(numberic[n]);
buffer.append(genericUnit[len-i-1]);
}
}

return normalize(buffer.toString());

}

private static String normalize(String s){
return s.replaceAll("^"+numberic[0]+"*(.*?)"+numberic[0]+"*$", "$1");
}


public static void main(String[] args) {

System.out.println(tranform("0006560000000"));;

}


}
52 楼 yangguo 2010-09-20  
呵呵,注释加的不错。
51 楼 laolinshi 2010-09-20  
小弟也来献丑了,下面是编程题的代码,望各位DX赐教,谢谢!
public class ConvertToChiness {
	
    private static String[] chineseMapStr = {"零","一","二","三","四","五","六","七","八","九"};  
    
    private static String[] specailStr0 = {"千","百","十"};
    
    private static String[] specailStr1 = {"亿","万"};
    
    public static void main(String[] args){
    	System.out.println(convert("2512359321"));
    }
    
    private static String convert(String numberStr){
    	StringBuffer buffer=new StringBuffer();
    	List<String> list=new ArrayList<String>();
    	
    	for(int i=0,j=numberStr.length();i<numberStr.length();i++,j--){
    		int num=Integer.parseInt(numberStr.substring(i,i+1));
    		String chinessNum=chineseMapStr[num];
    		String unit=getUnit(j);
    		if(chinessNum.equals("零")){
    			if(!list.isEmpty()){
    				String chinessNumInList=list.get(list.size()-1);
    				if(chinessNumInList.equals("零")){
    					list.remove(list.size()-1);
    				}
    			}
    		}
    		list.add(chinessNum);
    		if(!StringUtils.isEmpty(unit)){
    			if(chinessNum.equals("零")){
    				if(ArrayUtils.contains(specailStr0, unit)){
        				
        			}else if(ArrayUtils.contains(specailStr1, unit)){
        				list.remove(list.size()-1);
        				list.add(unit);
        			}
    			}else{
    				list.add(unit);
    			}
    		}	
    	}
    	
    	for(String num:list){
    		buffer.append(num);
    	}
    	return buffer.toString();
    }
    
    /**  
     * 位数表示,如亿、万等  
     * @param digit  
     * @return  
     */  
    private static String getUnit(int digit) {   
        String unit = "";  
        switch(digit) {   
        case 12:   
        case 8:   
        case 4:   
            unit = "千";   
            break;   
        case 11:   
        case 7:   
        case 3:   
            unit = "百";   
            break;   
        case 10:   
        case 6:   
        case 2:   
            unit = "十";   
            break;   
        case 9:   
            unit = "亿";   
            break;   
        case 5:   
            unit = "万";   
            break;   
        }
        return unit;   
    }   

}
50 楼 polaris1119 2010-09-20  
beipiaoonline 写道
第一题这样行不行:
十箱一块称,然后一箱一箱的往下拿,因为除了一箱少的,其余的都是一样重的

你这样相当于称了很多次吧

相关推荐

Global site tag (gtag.js) - Google Analytics