信息奥赛一本通1208:2的幂次方表示

1208:2的幂次方表示
【题目描述】
任何一个正整数都可以用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)

【输入】
一个正整数n(n≤20000)。

【输出】
一行,符合约定的n的0,2表示(在表示中不能有空格)。

【输入样例】
137
【输出样例】
2(2(2)+2+2(0))+2(2+2(0))+2(0)
方法一(方法二的改进版,用一个递归函数):

//1208:2的幂次方表示
#include
int i,a[15],num;
using namespace std;

void dfs(int n)
{
	int k;
	for(k=14;k>=0;k--)
	{
		if(a[k]<=n)//找到第一个,退出 
		break;	
	}
	//输出2的k次方
	if(k==0) //输出2的0次方 
	{
		cout<<"2(0)";
	}
	else if(k==2)//输出2的2次方 
	{
		cout<<"2(2)";
		
	}
	else if(k==1)//k=1时,只要输出2,不要输出2(1)的形式。 
		cout<<"2";
	else//k不等于0,1,2中的任意一个情况,即k>=3时,要继续分解 
	{
		//输出"2(k)",其中k继续调用dfs(k)函数进行分解输出 
		cout<<"2("; 
		dfs(k);
		cout<<")";
	}
	if(a[k]>num;
	dfs(num);
    return 0;
}

方法二(用了2个递归函数,优点麻烦):

//1208:2的幂次方表示
#include
int i,a[15],num;
using namespace std;
void dfs(int n);
void pr(int k) //输出2的k次方 
{
	if(k==0) cout<<"0";
	else if(k==1) return;
	else if(k==2) cout<<"2";
	else//当k=0或2时,直接0或2  
	{
		dfs(k);
	
	}
	
	return;
}
void dfs(int n)
{
	int k;
	for(k=14;k>=0;k--)
	{
		if(a[k]<=n)//找到第一个,退出 
		break;	
	}
	//输出2的k次方
	if(k!=1)//当k不等于1时,2的k次方都要写成"2(k)"形式, 
	{
		cout<<"2(";
		pr(k);//输出"2(i)"中间的i 
		cout<<")";
	}
	else//k=1是,只要输出2,不要输出2(1)的形式。 
		cout<<"2";
	if(a[k]>num;
	dfs(num);
    return 0;
}

你可能感兴趣的:(C++)