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

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

Chinaunix

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

[算法] 折半法求x的n次方 [復(fù)制鏈接]

論壇徽章:
0
跳轉(zhuǎn)到指定樓層
1 [收藏(0)] [報(bào)告]
發(fā)表于 2013-10-24 22:10 |只看該作者 |倒序?yàn)g覽
比如mypow(x, ,第一次循環(huán)算出x·x=x2,第二次循環(huán)算出x2·x2=x4,第三次循環(huán)算出4·x4=x8。這樣只需要三次循環(huán),時(shí)間復(fù)雜度是Θ(lgn)。思考一下如果n不是2的整數(shù)次冪應(yīng)該怎么處理。請分別用遞歸和循環(huán)實(shí)現(xiàn)這個(gè)算法。
  1. #include<iostream>
  2. using namespace std;

  3. //遞歸法
  4. double myPow(double x,int n){
  5.     int y=0;
  6.     if(n==1)return x;
  7.     y=n/2;
  8.     if((2*y)==n)
  9.         return myPow(x,n/2)*myPow(x,n/2);
  10.     else
  11.         return x*myPow(x,(n-1)/2)*myPow(x,(n-1)/2);
  12. }

  13. //循環(huán)法
  14. double myPow2(double x,int n){
  15.     if(n==1)return x;

  16.     int y=1,b=2,a=0;
  17.     while(n>b){
  18.         b*=2;
  19.         y++;
  20.     }
  21.     if(n!=b){
  22.         y--;
  23.         a=n-b/2;
  24.     }   

  25.     double product=x*x;
  26.     while(--y){
  27.         product*=product;
  28.     }
  29.     while(a--){
  30.         product*=x;
  31.     }
  32.     return product;
  33. }
  34. int main(){
  35.     cout<<myPow2(2,8)<<endl;
  36. }
復(fù)制代碼

論壇徽章:
0
2 [報(bào)告]
發(fā)表于 2013-10-25 00:15 |只看該作者
遞歸法
  1. double myPow(double x, int n)
  2. {
  3.         if (n <= 0) return 1.0;
  4.         if (n == 1) return x;
  5.         double halfX;
  6.         halfX = myPow(x, n/2);
  7.         return halfX * halfX * (n%2 ? x : 1.0);
  8. }
復(fù)制代碼

論壇徽章:
0
3 [報(bào)告]
發(fā)表于 2013-10-25 00:56 |只看該作者
非遞歸方法
  1. double myPow2(double x, int n)
  2. {
  3.         if (n <= 0) return 1.0;
  4.         if (n == 1) return x;
  5.         int flag = 0; //用來記錄什么時(shí)候要多乘以一個(gè)x
  6.         double half = 0.0; //用來記錄結(jié)果
  7.         int tmpN = n;
  8.         while (tmpN > 1)
  9.         {
  10.                 flag = 2 * flag + tmpN % 2;
  11.                 tmpN /= 2;
  12.         }
  13.         half = x;
  14.         while (tmpN < n)
  15.         {
  16.                 half *= half;
  17.                 half *= (flag % 2) ? x : 1.0; //當(dāng)此時(shí)flag不是2的倍數(shù)時(shí),表示要多乘一個(gè)x
  18.                 tmpN *= 2;
  19.                 tmpN += flag % 2;
  20.                 flag /= 2;
  21.         }
  22.         return half;
  23. }
復(fù)制代碼

論壇徽章:
14
巨蟹座
日期:2013-11-19 14:09:4615-16賽季CBA聯(lián)賽之青島
日期:2016-07-05 12:36:0515-16賽季CBA聯(lián)賽之廣東
日期:2016-06-29 11:45:542015亞冠之全北現(xiàn)代
日期:2015-07-22 08:09:472015年辭舊歲徽章
日期:2015-03-03 16:54:15巨蟹座
日期:2014-12-29 08:22:29射手座
日期:2014-12-05 08:20:39獅子座
日期:2014-11-05 12:33:52寅虎
日期:2014-08-13 09:01:31巳蛇
日期:2014-06-16 16:29:52技術(shù)圖書徽章
日期:2014-04-15 08:44:01天蝎座
日期:2014-03-11 13:06:45
4 [報(bào)告]
發(fā)表于 2013-10-25 08:47 |只看該作者
依次查看 n 的二進(jìn)制形式上的各位
舉個(gè)例子,假設(shè) n 為 5(二進(jìn)制為101)
那么 x^5 == (1*x^4) * (0*x^2) * (1*x^1)
  1. #include <iostream>
  2. using namespace std;

  3. double foo( double x, unsigned n )
  4. {
  5.     double r = 1.0;
  6.     for( double m=x; n; m*=m, n>>=1u )
  7.     {
  8.         if( n & 1u )
  9.             r *= m;
  10.     }
  11.     return r;
  12. }

  13. int main()
  14. {
  15.     cout << foo(2.1,13) << endl;

  16.     return 0;
  17. }
復(fù)制代碼

論壇徽章:
0
5 [報(bào)告]
發(fā)表于 2013-10-26 18:24 |只看該作者
本帖最后由 blackfur 于 2013-10-26 18:25 編輯

大哥,想問下怎樣寫簽名?我也想找工作^_^回復(fù) 4# bruceteen


   

論壇徽章:
14
巨蟹座
日期:2013-11-19 14:09:4615-16賽季CBA聯(lián)賽之青島
日期:2016-07-05 12:36:0515-16賽季CBA聯(lián)賽之廣東
日期:2016-06-29 11:45:542015亞冠之全北現(xiàn)代
日期:2015-07-22 08:09:472015年辭舊歲徽章
日期:2015-03-03 16:54:15巨蟹座
日期:2014-12-29 08:22:29射手座
日期:2014-12-05 08:20:39獅子座
日期:2014-11-05 12:33:52寅虎
日期:2014-08-13 09:01:31巳蛇
日期:2014-06-16 16:29:52技術(shù)圖書徽章
日期:2014-04-15 08:44:01天蝎座
日期:2014-03-11 13:06:45
6 [報(bào)告]
發(fā)表于 2013-10-28 08:39 |只看該作者
blackfur 發(fā)表于 2013-10-26 18:24
大哥,想問下怎樣寫簽名?我也想找工作^_^回復(fù) 4# bruceteen

頁面最上端有個(gè)“設(shè)置”,然后是 個(gè)人資料\個(gè)人信息\個(gè)人簽名
不過,我貼了這么久,屁用沒有^_^
您需要登錄后才可以回帖 登錄 | 注冊

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

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP