謝謝版主提供的辦法:用建構式數學的除法原理.
不過這將造成效能的問題:如餘數為100除數為99時將作9次的乘法
才能求到商數1的所要結果......
其實有一個辦法可加快商數的預測...其中有一個昨天測試時找到的bug
方法如下:
取餘數最高位除以除數最高位:如餘數為967,除數是234則取9除2得n
這樣迴路內只要從n*234開始:當乘積大於除數則減少n的值直到乘積小於234該n
即是所要的商數了;不過bug也在這裡:當餘數的最高位數值小於除數的最高位數值
如餘數101除數99時怎麼辦呢?
當時的想法是取第二位不過這又有另一個問題:程式是要求不限位數的所以如
除數是123456789遇到餘數是123456780這樣就會求出不正確的商數了
所以需加入一判斷其原型如下:
/*
進行比較兩字串的numcmp()不是標準函數的字串比較函數因為標準函數的字串
比較函數在遇到999和1000的字串時999是比1000大的,但數字999比1000小;
不過numcmp()也有用到標準函數memcmp()只不過需先標齊小數點位置後
(整數的小數點位置在個位數右邊一位)再以memcmp()比較後傳回memcmp()
的傳回值
*/
if( (x=numcmp(rem,divisor,maxlen)) < 0)
__return(0)/*該位的商數為0,返回呼叫者函數進行補位或補0*/
/*底下就是商數可能值的預測:通過numcmp()則rem已大於或等於divisor*/
if(x>0)
{
__if(*(divisor+0) >= *(rem+0))/*除數最高位>=餘數最高位*/
__{
____if(strlen(rem)==strlen(divisor))/*兩字串長度相同*/
______buf[0]='1';
____else
______buf[0]='9';/*將執行1~9次*/
__}
__else/*除數最高位<餘數最高位*/
__{
____bfs[0]=*(divisor+0);
____bfr[0]=*(rem+0);
____buf[0]=atoi(bfb)/atoi(bfa)+48;
__}
else/*x==0 rem字串與divisor字串相同*/
__buf[0]='1';
loopmax=atoi(buf);
底下就是進行乘法的迴路了;從上面的預測中最好的狀況下只要進行1次乘法
即可令乘積小於餘數而返回n值(商數);一般情況則最多兩次;最差的就是9次了
不過最差的情況要有一定條件(未補位前的餘數是一接近整除的值如10除9)所以
效能上並不會太差,不過應該還有更好的方法吧?只是我現在還不會
家裡的網路牽好了應該這幾天就可以將程式貼上來了到時希望各位能給予指教
還有一個問題是該程式有將近800行不知道應該一次貼上來還是分成函數個別
貼這點請版主給點意見
還有一個問題:貼上來的文章空白(前面的)都會被吃掉;所以縮排就有問題了這點該怎麼解決啊??