黑马程序员技术交流社区
标题:
这段代码有点迷惑,各位大虾帮忙详细解释一下
[打印本页]
作者:
黑马-唐磊
时间:
2012-5-30 14:33
标题:
这段代码有点迷惑,各位大虾帮忙详细解释一下
本帖最后由 黑马-唐磊 于 2012-5-30 15:52 编辑
这是张孝祥老师面试宝典的一题,我主要是对convert方法的代码有点困惑,希望大虾们能详细解释一下
public class Demo {
private static final char[] data=new char[]{
'零','壹','贰','叁','肆','伍','陆','柒','捌','玖'
};
private static final char[] units=new char[]{
'元','拾','佰','仟','万','拾','佰','仟','亿'
};
public static void main(String[] args) {
System.out.println(convert(35543));
}
public static String convert(int money){
StringBuffer sb=new StringBuffer();
int unit=0;
while(money!=0){
sb.insert(0, units[unit++]);
int number=money%10;
sb.insert(0, data[number]);
money/=10;
}
return sb.toString();
}
}
作者:
李哲
时间:
2012-5-30 15:05
本帖最后由 李哲 于 2012-5-30 15:09 编辑
可是这个代码和入学考试最后的题还差得远,比如不能超过亿,不能处理50003类似的数值。还要经过很多判断语句的添加
public class Demo {
private static final char[] data=new char[]{
'零','壹','贰','叁','肆','伍','陆','柒','捌','玖'
};
private static final char[] units=new char[]{
'元','拾','佰','仟','万','拾','佰','仟','亿'
};
public static void main(String[] args) {
System.out.println(convert(35543));
}
public static String convert(int money){
StringBuffer sb=new StringBuffer();//定义StringBuffer来盛放汉字字符
int unit=0;
while(money!=0){
sb.insert(0, units[unit++]);
//StringBuffer的第1个位置插入'元'
//StringBuffer的第1个位置插入'拾',
//StringBuffer的第1个位置插入'佰'
//StringBuffer的第1个位置插入'仟'
//StringBuffer的第1个位置插入'万'
int number=money%10;
//35543%10=3
//3554%10=4
//355%10=5
//35%10=5
//3%10=3
sb.insert(0, data[number]);
//'元'之前插入'叁'
//'拾'之前插入'肆'
//'拾'之前插入'伍'
//'拾'之前插入'伍'
//'拾'之前插入'叁'
money/=10;
//35543/10=3554
//3554/10=355
//355/10=35
//35/10=3
//3/10=0
}
return sb.toString();
}
}
复制代码
作者:
武剑峰
时间:
2012-5-30 15:31
本帖最后由 武剑峰 于 2012-5-30 15:39 编辑
请看用法:
insert(int offset, char c)
向offset位置插入字符变量c的内容
StringBuffer sb2 = new StringBuffer("wujianfeng");
System.out.println(sb2.insert(1, 'a'));
System.out.println(sb2.insert(2, 'b'));
System.out.println(sb2.insert(1, 'c'));
System.out.println(sb2.insert(0, 'd'));
结果为:
waujianfeng
wabujianfeng
wcabujianfeng
dwcabujianfeng
那么这个就会看出来StringBuffer变量创建后,从左边往右数位置号分别为0123456789,那么楼主的问题就解答了,
注意这个变量int unit=0 //其实这个变量定义为i,就不会被混淆了
while(money!=0){ //判断变量是否为零,其实实际中应该判断变量是否大于0
sb.insert(0, units[unit++]); //如果不为零在sb的第零位插入units的第unit个值,中括号里面的unit 相当于i++,插入后整型变量unit值加1
int number=money%10; //因为是int型,求余得到个位数是多少,列如51%10=1
sb.insert(0, data[number]);//在sb的第零位插入data数组的第number个值,这里的number相当于j
money/=10; //money的值变小10倍,小于零的部分就没有了,列如564/10=56
}
作者:
凡延海
时间:
2012-5-30 16:09
这个convert() 的编写用到了两个知识点:
第一个是StringBuffer类的insert方法其全称是public StringBuffer insert(int offset,char c) StringBufferl实例有自己的缓冲区,当第一次存入元、叁后,其0偏移量在缓冲区就会前移四个字节,从下一个字节开始从新存入数据。依次在存入拾、肆等。
第二个就是通过取余获得整数的每个位数。money%10获得最低位数值,然后呢money/10进行下一轮的计算在次获得最低位数值,这样就把整数从个位到十位一直到万位得出来了,如楼上所描述的一样。
作者:
杨天皓
时间:
2012-5-30 16:35
我不给你敲代码
首先,你要先明白这个程序是干嘛的?
它是将一串数字,转换为人民币的大写形式。
其次,它是用什么方法来实现的?
它是运用查表发来实现的。
具体的代码的实现。
首先是先定义两个数组,按照依次的顺序来存储人名币大写形式以及个个单位。
并且通过int number=money%10;来获取当前最后一位数,也就是从个位开始获取,直到最高位。
和money/=10;来控制循环条件
然后通过number获取的角标依次在数组中查。然后显示。
虽然我讲的不是很好,但是你带着这个思想再去看代码就容易的多了。
欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/)
黑马程序员IT技术论坛 X3.2