信息学奥赛一本通 1069:乘方计算 | OpenJudge NOI 1.5 13
生活随笔
收集整理的這篇文章主要介紹了
信息学奥赛一本通 1069:乘方计算 | OpenJudge NOI 1.5 13
小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.
【題目鏈接】
ybt 1069:乘方計(jì)算
OpenJudge NOI 1.5 13:乘方計(jì)算
【題目考點(diǎn)】
1. 循環(huán)求冪
- 設(shè)變量r初始值為1:int r = 1;
- 循環(huán)n次每次循環(huán)中輸入變量a,將r的值設(shè)為r*a:r *= a;
- 循環(huán)結(jié)束后,r即為ana^nan
2. 調(diào)用乘方函數(shù)pow()(存在于<cmath>中)
double pow(double a, double b); 求aba^bab
3. (擴(kuò)展)快速冪
一般循環(huán)求ana^nan時(shí)間復(fù)雜度為O(n),快速冪求ana^nan時(shí)間復(fù)雜度為O(logn)
- 設(shè)結(jié)果變量r初始值為1:int r = 1;,
- 此時(shí)r需要乘以ana^nan才能得到最終結(jié)果
- 如果此時(shí)n為奇數(shù),那么r *= a;,此時(shí)r還需要乘以n-1個(gè)a,使n = n - 1。如果n是偶數(shù),則跳過這一步。(由于n是奇數(shù),整除運(yùn)算 n/2 的值與 (n-1)/2的值是相等的,所以這一步中n = n - 1可以省略)
- 此時(shí)r需要乘以ana^nan,已知an=(a2)n2a^n=(a^2)^{\frac{n}{2}}an=(a2)2n?,所以使a *= a; n /= 2;后,r需要乘的仍然是ana^nan
- 重復(fù)上述步驟,直到n為0為止。r即為最終結(jié)果
4.(擴(kuò)展)遞歸求冪
【題解代碼】
解法1:循環(huán)求冪
#include <bits/stdc++.h> using namespace std; int main() {int a, n, r = 1;cin>>a>>n;for(int i = 0; i < n; ++i)r *= a;cout<<r;return 0; }解法2:調(diào)用<cmath>中pow()函數(shù)
#include<bits/stdc++.h> using namespace std; int main() {int a, n;cin>>a>>n;cout<<(int)pow(a, n);//cout直接輸出浮點(diǎn)數(shù)相當(dāng)于用printf以%g形式輸出,當(dāng)有效數(shù)字位數(shù)很多時(shí)會(huì)以科學(xué)計(jì)數(shù)法的形式輸出。轉(zhuǎn)為int型后就會(huì)直接輸出數(shù)字。return 0; }解法3:快速冪
#include<bits/stdc++.h> using namespace std; int main() {int a, n, r = 1;//r:結(jié)果cin>>a>>n;while(n > 0){if(n % 2 == 1)r *= a;a *= a;n /= 2;}cout<<r;return 0; }解法4:遞歸求冪
#include <bits/stdc++.h> using namespace std; int mi(int a, int n) {if(n == 0)return 1;elsereturn a * mi(a, n - 1); } int main() {int a, n, r = 1;cin>>a>>n;cout<<mi(a, n);return 0; }總結(jié)
以上是生活随笔為你收集整理的信息学奥赛一本通 1069:乘方计算 | OpenJudge NOI 1.5 13的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 信息学奥赛一本通(1133:输出亲朋字符
- 下一篇: 信息学奥赛一本通(1197:山区建小学)