遞歸實現快速冪(C++版)


快速冪是什么?

顧名思義,快速冪就是快速算底數的n次冪。其時間復雜度為 O(log₂N), 與朴素的O(N)相比效率有了極大的提高。 

就以a的b次方來介紹:
把b轉換成二進制數,該二進制數第i位的權為

例如:

11的二進制是1011
11 = 2³×1 + 2²×0 + 2¹×1 + 2º×1
因此,我們將a¹¹轉化為算

如何編寫快速冪代碼?

以下是用C++語言編寫的兩種代碼,可供各位參考:

 1 //快速冪1(數字較小):
 2 #include<bits/stdc++.h>
 3 using namespace std;
 4 long long f(long long n,long long m)
 5 {
 6     //求的是m個n相乘,這里n是一個正整數
 7     if(m==0)return 1;
 8     else if(m==1)return n;
 9     else if(m%2==0)return f(n*n,m/2);//偶數時的降冪
10     return f(n*n,m/2)*n;//奇數時的降冪
11 }
12 int main()
13 {
14     long long n,m;
15     cin>>n>>m;
16     cout<<f(n,m); 
17     return 0;
18 }
 1 //快速冪2(數字較大):
 2 #include<bits/stdc++.h>
 3 using namespace std;
 4 int k;
 5 long long f(long long n,long long m)
 6 {
 7     //求的是m個n相乘,這里n是一個正整數
 8     if(m==0)return 1;
 9     else if(m==1)return n%k;
10     else if(m%2==0)return f((n%k)*(n%k),m/2)%k;//偶數時的降冪
11     return f((n%k)*(n%k),m/2)*(n%k)%k;//奇數時的降冪
12 }
13 int main()
14 {
15     long long n,m;
16     cin>>n>>m>>k;
17     cout<<f(n,m); 
18     return 0;
19 }

記住一點:數字較大的時候只要把原先的程序能模(%)的都模掉,否則數據太大,容易報表!

下面給大家一道題提升一下,如果大家有想法,可以私信我哦!(下期告訴大家參考答案)

題目描述 Description
有n頭奶牛住在n個環形的牛圈,奶牛編號為0到n-1,牛圈編號也為0到n-1,i號牛住在第i號牛圈。
現在牛們想實施住宅滾動制度。每滾動一次,第0號圈的奶牛會順時針搬到第m號牛圈中,第1號圈的奶牛會順時針搬到第1+m號牛圈中,...,第n-m號圈的奶牛會順時針搬到0號牛圈,
也就是說原來的第i號牛圈的奶牛會順時針搬到i+m號牛圈。
試判斷,進行了10^k輪滾動后,原來在x號圈的奶牛現在在幾號牛圈。

輸入描述 Input Description
一行,四個正整數,n m k x

輸出描述 Output Description
10^k輪后,最初在第x個圈的奶牛所處牛圈的編號

樣例輸入 Sample Input
10 3 4 5

樣例輸出 Sample Output
5

數據范圍及提示 Data Size & Hint
對於 30%的數據,0 < k < 7;
對於 80%的數據,0 < k < 10^7;
對於 100%的數據,1 < n < 1,000,000,0 < m < n,1 <= x <=n,0 < k < 10^9。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM