剛解完2.15這道題([c]證明x的62次方可以只用8次乘法算出)往下看就發現了這個,直接貼上我解2.15這道題的時候的出現的一種解法就行了,而且演算法恰好滿足2.16和2.17的要求。
程式如下:
//used用來累計使用乘法的次數
#include
#include
#define number 2
#define p 62
int used =0;
//62=32+16+8+4+2
long
longp(
long
long x,
int in)
}while
((in >>=1)
&&((x *
= x),(
++used),1
));//這裡while內的乘法也被計入
return number;
}int
main()
演算法很簡短,計算速度很快,也不占用空間,主要依靠冪的最右邊的二進位制位是否為1來判斷是否相乘從而使冪相加(同底數冪相乘,底數不變,指數相加),使得冪最終達到62,算出n^62次方的值。
tip:(x *= x)之所以不寫在迴圈體內,是因為這樣可以減少掉最後使那一次無意義的乘法
通過計算器可知結果是對的,該演算法只需要十步
C程式 快速冪
1 給定三個正整數 a,b,c a typedef long long ll ll pow ll a,ll b,ll m class mathcode src b 這裡要使用快速冪的思想,它基於二分的思想,因此也稱為二分冪。如果b是奇數,那麼有 如果b是偶數,那麼有 顯然,b是奇數的情況下總可以在下...
求冪的遞迴和非遞迴實現
遞迴版本的實現 long long int pow1 int x,unsigned int n if n 0x01 else return pow x x,n 1 遞迴 的基準條件是 n 0 此時返回1 不呼叫自身 若n是偶數,則x的n次方等於 x x的n 2次方。若n是奇數,則x的n次方等於 x ...
快速冪非遞迴實現(即求x的n次方)
如果用遞迴的方法求冪,可以是這樣的 double pow double x,unsigned int n 注意 n若為乙個奇數,那麼它對應的二進位制最後一位一定是1,與上1最終一定是1 上面的n為非負,如果要求負數次冪,可以先求正數次冪再用1除之 上述方法雖然簡單,但是效率並不高.因為函式呼叫的代價...