2的幂次方C++

(一)干货

    (1)审题

        任何一个正整数都可以用2的幂次方表示.。

        例如:137=2^7+2^3+2^0同时约定次方用括号来表示,即a^b可表示为a(b)。

        由此可知,137可表示为:2(7)+2(3)+2(0) 

        进一步:7=2^2+2+2^0 (2^1用2表示) 3=2+2^0

        所以最后137可表为:2(2(2)+2+2(0))+2(2+2(0))+2(0)    

        又如:1315=2^10+2^8+2^5+2+1

        所以1315最后可表示为:2(2(2+2(0))+2)+2(2(2+2(0)))+2(2(2)+2(0))+2+2(0)

        题目十分容易理解,只要把一个数用二次方分解开

   (2)简单思路

        很好,用脑子想一想也知道这是一道递归(dfs)

        我们通过读题可以知道

       (1):数可以通过多次或一次分解开成多个次方相加。

       (2):如果分解到1,2,0这三个次方是直接输出的(分别输出2,2(2),2(0))。

       (3):如果分解到的不是1,2,0就要继续分解。

       (4):每分解好一个位数上的数字后用 ‘+’ 连接。

    

    (3)深入思考

        想把一个数分解开,因为题目要求是二进制,所以可以把这个数用二进制表示。

        我们可以定义一个长度为16的数组(题目要求输入书 <= 20,20的二进制15位)

        然后把这个二进制的数放进数组中。

        最后嘞就可以开始分解了。

        有时候分解不净,要继续分解,这时候就回溯了。

(二)代码解析

        (1)dfs

2的幂次方C++_第1张图片

    (2)主函数

int main()
{
	a[0] = 1;
	for(int i = 1; i <= 14; i++)
	{
		a[i] = 2 * a[i - 1];
	}//二进制数组
	cin >> num;
	dfs(num);
	return 0;
}

(三)全部代码

#include 
using namespace std;
const int N = 15;
int num ,a[N];
void dfs(int n)
{
	int k;
	for(k = 14; k >= 0; k--)
	{
		if(a[k] <= n)
		{
			break;
		}
	}
	if(k == 0)
	{
		cout << "2(0)";
	}
	else if(k == 1)
	{
		cout << "2";
	}
	else if(k == 2)
	{
		cout << "2(2)";
	}
	else
	{
		cout << "2(";
		dfs(k);
		cout << ")";
	}
	if(a[k] < n)
	{
		cout << "+";
		dfs(n - a[k]);
	}
}
int main()
{
	a[0] = 1;
	for(int i = 1; i <= 14; i++)
	{
		a[i] = 2 * a[i - 1];
	}
	cin >> num;
	dfs(num);
	return 0;
}

你可能感兴趣的:(2的幂次方C++)