作者chchwy (mat)
看板NTUE-CS100
标题Re: [课业] 大数运算
时间Sun Dec 28 16:38:50 2008
目标一: BigNum(String input){}
怎麽把String转成科学记号法呢? 阿就...用眼睛看就好啦( ̄▽ ̄#)﹏﹏
电脑没眼睛是要看三小... ( ‵□′)───C<─___-)|||
其实也没错啦,没什麽诀窍就用观察法吧。
首先是正负号,判断字串的第一个字是不是'-',简单....
再来假数,把字串全读进来,碰到不是数字就扔掉,轻轻松松...
(对了,开头零要全部拔掉 0.00045 => 假数45 )
次方部份呢,
比如说 "456.78",要表示成"45678*10^-2"
找到小数点在index=3的位置,最後一个字元'8'在index=5的位置
3 - 5 = -2次方
但是"45678*10^-2"还不是正确的格式,应该要写成"4.5678*10^2"才对
所以最後一步要做正规化。
BigNum(String input){
//---判断正负号---
if(input.charAt(0)=='-') sign=1;
else sign=0;
//---假数---
mantissa = new StringBuffer(input); //先整个字串吃进来
for(int i=0;i<mantissa.length();i++){ //所有不是数字的char都删掉
char c = mantissa.charAt(i);
if( c>'9' || c<'0' ){
mantissa.deleteCharAt(i);
i--;
}
}
for(int i=0;i<mantissa.length();++i){ //拔掉开头零
if(mantissa.charAt(i)=='0' ) mantissa.deleteCharAt(i);
else break;
}
//---次方---
int point = input.indexOf('.'); //找小数点位置
int lastChar = input.length()-1; //最後一个字元位置
if( point == -1) //没找到小数点,那也不用减啦
exp=0;
else
exp = point - lastChar;
//---正规化---
exp = exp + mantissa.length() - 1 ; //Why? 自己想想如何?
}
==
到此为止,算是相当完整了,各位可以测试看看成果。
BigNum kerker = new BigNum("-123456.789");
System.out.println("sign=" + kerker.sign);
System.out.println("exp=" + kerker.exp);
System.out.println("mantissa=" + kerker.mantissa);
检验自己是不是写对了
不过上面的程式,可能没考虑到一些小状况,请测试看看下面这几个数
"-0.0009"
"9999.456789"
"0"
"-0"
"0.456789000"
跑出来结果都正确吗?
如果不正确,是发生什麽问题了? 要怎麽改呢?
自己试试看吧,应该不难才对。
--
「人生有很多个十年,但如果刚好是十八岁到二十八岁,那就是一辈子了。」
「我们常常高估十年後能做的事,却忽略一年内能做的事」
--
※ 发信站: 批踢踢实业坊(ptt.cc)
◆ From: 203.68.15.209
※ 编辑: chchwy 来自: 203.68.15.209 (12/28 16:40)
※ 编辑: chchwy 来自: 203.68.15.209 (12/28 16:42)
※ 编辑: chchwy 来自: 203.68.15.209 (12/28 18:32)
1F:推 einstein1217:感谢你 12/29 00:58