亚洲av成人无遮挡网站在线观看,少妇性bbb搡bbb爽爽爽,亚洲av日韩精品久久久久久,兔费看少妇性l交大片免费,无码少妇一区二区三区

  免費(fèi)注冊(cè) 查看新帖 |

Chinaunix

  平臺(tái) 論壇 博客 文庫(kù)
最近訪問板塊 發(fā)新帖
查看: 3012 | 回復(fù): 2
打印 上一主題 下一主題

一個(gè)任意長(zhǎng)整數(shù)的除數(shù)的算法??! [復(fù)制鏈接]

論壇徽章:
0
跳轉(zhuǎn)到指定樓層
1 [收藏(0)] [報(bào)告]
發(fā)表于 2008-05-14 01:50 |只看該作者 |倒序?yàn)g覽
已知正整數(shù)m, 一定存在一個(gè)非負(fù)整數(shù)n, 使得2的n次方小于等于m, 并且m小于2的n+1次方, 即2^n <= m < 2^(n+1); (不等式 1)

現(xiàn)求a/b! a, b都為正整數(shù)! 可設(shè)a = bm + r, m為商,r為余數(shù), 滿足 0<= r < b。  又根據(jù)上面的不等式1,
有 (b*(2^n) + r) <= (bm + r) < (b*(2^(n+1)) + r);     而 0 <= r < b;   
     b*(2^n) <= (b*(2^n) + r) <= a < (b*(2^(n+1)) + r) < (b*(2^(n+1)) + b);
有 b * (2^n) <= a < b * (2^(n+1)) + b; (不等式 2)    其實(shí)不等式2的右邊可縮小范圍為 a < b*(2^(n+1));
因?yàn)槿绻?a >= b*(2^(n+1)), 則m >= 2^(n+1)  明顯與不等式1矛盾.  我們有 b*(2^n) <= a < b*(2^(n+1)); (不等式3)
利用不等式3可求得2^n 和2^(n+1), 然后再利用折半查找(當(dāng)然也可以用其它更好的方法)查找滿足條件的m!

除法的非遞歸算法偽代碼如下:
       Divide: a, b
       //注意所有變量和常量都是任意長(zhǎng)整數(shù),它們之間的各種操作和比較都應(yīng)另外實(shí)現(xiàn),這里的描述只是為了方便說(shuō)明
       if(a < b) return 0;
       power1 = 1; power2= 2;  n = 0; value1 = b * power1; value2 = b * power2;
           while( !(value1 <= a && a < value2))           //利用不等式3,得到2^n和2^(n+1)
           {
                  power1 = power2;      power2 *= 2;     //power1,power2 分別代表2^n和2^(n+1)
                  value1 = b * power1;             // value1 =  b * (2^n)              
                  value2 = b * power2;             // value2 =  b * (2^(n+1))
                  n++;                                       // 通過n來(lái)估計(jì)m有多大,當(dāng)然n遠(yuǎn)比m小得多
            }
            //從2^n到2^(n+1)中折半查找,總共有2^n+1個(gè)元素(當(dāng)然2^(n+1)不會(huì)
        low = power1;  high = power2;
            while(low<=high){
                  mid = (low + high) / 2;           //這里另外寫一個(gè)除以2的函數(shù)(比較簡(jiǎn)單),不過也啟發(fā)我們可以用遞歸實(shí)現(xiàn),可能又不一樣了
            if(0 <= (a - b * mid) && (a - b * mid) < b)     return mid;    //找到m
                  else  if((a - b * mid) < 0)  high = mid;                                //繼續(xù)在前半?yún)^(qū)進(jìn)行查找
            else  low = mid;                                                                 //繼續(xù)在后半?yún)^(qū)進(jìn)行查找
        }
               
以上就是我的一點(diǎn)思路,提出來(lái)讓大家看看,希望大牛們給提提意見!( 前面說(shuō)了那么多,只是為了讓大家更好理解,敬請(qǐng)?jiān)彛?
當(dāng)然本人是個(gè)菜鳥,編程能力不行,只好寫偽代碼,也不知寫得對(duì)不對(duì),請(qǐng)大家不要砸雞蛋石頭,多提點(diǎn)寶貴意見!謝謝。

論壇徽章:
0
2 [報(bào)告]
發(fā)表于 2008-05-14 10:07 |只看該作者
不知道你這個(gè)任意長(zhǎng),怎么個(gè)實(shí)現(xiàn)法。如果任意長(zhǎng)是數(shù)字長(zhǎng)度,不知道你這個(gè)算法如何適應(yīng)2048位的除法?

論壇徽章:
0
3 [報(bào)告]
發(fā)表于 2008-05-14 12:43 |只看該作者
是的,任意長(zhǎng)是指數(shù)字長(zhǎng)度,當(dāng)然在現(xiàn)實(shí)中不可能是任意長(zhǎng),只要能滿足一定的需求就行了!
至于您說(shuō)的2048位是指被除數(shù)還是商? 我的本意是如果n是幾百,幾千或者更大,那么2^n已經(jīng)是很大了, 而我個(gè)人分析認(rèn)為那個(gè)算法的復(fù)雜度是n+log2(2^n+1)≈2n(不知是否正確),那么你得到m
只需線性次加,減,乘和比較的操作就行了. 具體實(shí)現(xiàn)時(shí),如果整數(shù)很大的話,連怎樣存儲(chǔ)都要仔細(xì)考慮,更不用說(shuō)其它方面啦! 如果您說(shuō)的是指n=2048的話,不知我是否可認(rèn)為大概只需4096次就可以算出m(2^n <= m < 2^(n+1))?? 我提出這個(gè)問題是為了知道這個(gè)算法是否可行??效率有多高???
希望大家多多指點(diǎn)!!
您需要登錄后才可以回帖 登錄 | 注冊(cè)

本版積分規(guī)則 發(fā)表回復(fù)

  

北京盛拓優(yōu)訊信息技術(shù)有限公司. 版權(quán)所有 京ICP備16024965號(hào)-6 北京市公安局海淀分局網(wǎng)監(jiān)中心備案編號(hào):11010802020122 niuxiaotong@pcpop.com 17352615567
未成年舉報(bào)專區(qū)
中國(guó)互聯(lián)網(wǎng)協(xié)會(huì)會(huì)員  聯(lián)系我們:huangweiwei@itpub.net
感謝所有關(guān)心和支持過ChinaUnix的朋友們 轉(zhuǎn)載本站內(nèi)容請(qǐng)注明原作者名及出處

清除 Cookies - ChinaUnix - Archiver - WAP - TOP