P1010 [NOIP1998 普及组] 幂次方 - 洛谷 | 计算机科学教育新生态 (luogu.com.cn)
这道题不难,只是普及-难度,可是它的输出好恶心,好繁琐,假如它问我任意一个数能拆成n个2次幂相加,输出这个等式,那就非常简单了。不过这道题就是在这基础上继续递归,使其输出0、2。我们先看看输出等式的代码,然后在其基础如何进行修改。
//1315=1024+256+32+2+1
#include <bits/stdc++.h>
#define MOD 1000000007
#define INF 0x3f3f3f3f
using namespace std;
typedef long long LL;
int n;
void dfs(int x) {
if(x!=0) {
int p=1;
while(x>=p) p*=2;
p=p/2;//找到当前值的最大2的幂即可
if(x==1) cout<<1;
x-=p;
if(x) {
cout<<p<<"+";
dfs(x);//递归输出2的幂
}
}
}
int main() {
cin>>n;
cout<<n<<"=";
dfs(n);
return 0;
}
上面就是输出等式,我们在其基础上如何修改呢?假如1315需要分解成1024,而1024分解成2^10,10又要继续分解为2^3+2,3继续分解为2^1+2^0,这样才完整分解完,所以我们需要一个变量来存储当前x=2的几次幂。我们看到了上面的2^0,所以需要对其进行特判。(注意括号的关系)
#include <bits/stdc++.h>
#define MOD 1000000007
#define INF 0x3f3f3f3f
using namespace std;
typedef long long LL;
int n;
void dfs(int x) {
if(x!=0) {
cout<<2;
int p=1,q=0;
while(x>=p) {
p*=2;
q++;//q次幂
}
q--;
p=p/2;
if(q==0) printf("(%d)",q);//q为0证明x为1(特判)
//q>1就是要进行q次幂的分解(注意输出括号)
if(q>1) {
cout<<"(";
dfs(q);
cout<<")";
}
x-=p;
//x非0就继续分解x
if(x) {
cout<<"+";
dfs(x);
}
}
}
int main() {
cin>>n;
dfs(n);
return 0;
}