Re: [課業] 大數運算
目標一: 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)
推
12/29 00:58, , 1F
12/29 00:58, 1F
討論串 (同標題文章)