AcWing 3483. 暴力打表 + 递归
原题链接
中等
作者:
天才美少女卡莎
,
2021-05-21 20:10:11
,
所有人可见
,
阅读 418
暴力打表
C++ 代码
//因为n的范围不超过20000,所以可以把2的0次方到2的14次方全部列出来
#include<iostream>
#include<cstring>
#include<vector>
using namespace std;
int main(){
vector<int> v;
int n;
while(cin >> n){
v.clear();
for(int i = 14; i >= 0; i --){
if(n >> i & 1) v.push_back(i);
}
for(auto i : v){
if(i == 14) printf("2(2(2+2(0))+2(2)+2)");
else if(i == 13) printf("2(2(2+2(0))+2(2)+2(0))");
else if(i == 12) printf("2(2(2+2(0))+2(2))");
else if(i == 11) printf("2(2(2+2(0))+2+2(0))");
else if(i == 10) printf("2(2(2+2(0))+2)");
else if(i == 9) printf("2(2(2+2(0))+2(0))");
else if(i == 8) printf("2(2(2+2(0)))");
else if(i == 7) printf("2(2(2)+2+2(0))");
else if(i == 6) printf("2(2(2)+2)");
else if(i == 5) printf("2(2(2)+2(0))");
else if(i == 4) printf("2(2(2))");
else if(i == 3) printf("2(2+2(0))");
else if(i == 2) printf("2(2)");
else if(i == 1) printf("2");
else if(i == 0) printf("2(0)");
if(i == v[v.size() - 1]) break;
printf("+");
}
printf("\n");
}
return 0;
}
递归
C++ 代码
#include<iostream>
using namespace std;
string dfs(int n){
string res;
for(int i = 14; i >= 0; i --){
if(n >> i & 1){
if(res.size()) res += "+";
if(!i) res += "2(0)";
else if(i == 1) res += "2";
else res += "2(" + dfs(i) + ")";
}
}
return res;
}
int main(){
int n;
while(cin >> n){
cout << dfs(n) << endl;
}
return 0;
}