每日一题——递归之0、2杂交

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;
}

猜你喜欢

转载自blog.csdn.net/weixin_61017400/article/details/124205878