題目:點此,
題意描述:
任何一個正整數都可以用2的冪次方表示,例如:
137=27+23+20
同時約定方次用括號來表示,即ab可表示為a(b),由此可知,137可表示為:
2(7)+2(3)+2(0)
進一步:7=22+2+20(21用2表示)
3=2+20
所以最后137可表示為:
2(2(2)+2+2(0))+2(2+2(0))+2(0)
又如:
1315=210+28+25+2+1
所以1315最后可表示為:
2(2(2+2(0))+2)+2(2(2+2(0)))+2(2(2)+2(0))+2+2(0)
思路:
使用遞回,如果要輸出的是2,直接輸出2;如果是1,輸出2(0),
計算log2n(我的up_pow函式),并存盤,
先輸出一個2,如果i也就是㏒2n不是一,輸出左括號“(”,遞回呼叫i,再輸出右括號“)”,
如果還有剩余(n-2i!=0)輸出+,遞回呼叫,然后結束函式,
再main函式中,只需讀入n,然后呼叫函式即可,
犯的錯誤:
- 快速冪沒加回傳值,
- 有很多地方應是i不是i-1,
- 快速冪函式沒加邊界條件,
識訓:
- 要仔細,不要漏東西,
代碼:
#include <iostream>
using namespace std;
int quick_pow(int index,int r){
if(r==0){
return 1;
}
if(r==1){
return index;
}
int data=https://www.cnblogs.com/eason66-blog/p/1;
if(r%2!=0){
data=index;
}
int type=quick_pow(index,r/2);
data*=type*type;
return data;
}
int up_pow(int max){
int index=1,number=0;
while(indexmax){
number--;
}
return number;
}
int f(int n){
if(n==1){
cout <<"2(0)";
return 0;
}
if(n==2){
cout << "2";
return 0;
}
int i=up_pow(n);
cout << "2";
if(i!=1){
cout << "(";
f(i);
cout << ")";
}
n-=quick_pow(2,i);
if(n!=0){
cout << "+";
f(n);
}
return 0;
}
int main(){
int n;
cin >> n;
f(n);
return 0;
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/67293.html
標籤:C++
下一篇:結題報告
