P1010 [NOIP 1998 普及组] 幂次方 题解

博客园食用更加

题外话

也是在浏览题目,寻找能写的题解的时候看到了这道上老题,但是呢,这道题目的题解好像已经没有了,所以我也是来来发一篇随笔,一边供各位神犇们阅读,并寻找问题 虽然我对我的题解水平十分的(mei)有信心!!

以下题解!!

part 1 题面

biu~

任意一个正整数都可以拆成若干 2 的幂次相加。
规定:a^b 写成 a(b)
特殊约定:$2^1$直接简写为 2,不能写成 2(1)
2^0 固定写成 2(0)
每一个幂次里面的数字也要继续递归拆解,直到只剩下 02
样例:
137 = 2^7 + 2^3+2^0
逐层拆解最后得到:
2(2(2)+2+2(0))+2(2+2(0))+2(0)

part 2 思路

就是分解成 2 的幂次

栤的教训:
  • 2¹ 直接写 2

  • 2⁰ 写 2(0)

part 3 代码思路

  • 停止条件:数字 = 0 → 输出 0

  • 数字 = 1 → 不处理;

  • 数字 = 2 → 输出 2

part 4 AC代码

#include <bits/stdc++.h>
using namespace std;

void calc (int n)
{
	if (n == 0)
	{
		cout << 0;

		return;
	}

	if (n == 1)
	{
		cout << 1;

		return ;
	}

	if (n == 2)
	{
		cout << 2;

		return ;
	}

	for (int i = 14; i >= 0; i--)
	{
		int tmp = 1 << i; // 1 << ?代表 2 * 2 * 2 …* 2(?个 2 相乘)

		if (tmp <= n)
		{
			if (i == 1)
			{
				cout << 2;
			}
			else
			{
				cout << "2("; // 2 的 ?次方 
				
				calc (i); // 开始递归 
				
				cout << ")"; //前括号的结束 
			}

			n -= tmp; // 留下的东西

			if (n > 0)
			{
				cout << "+";
			}
		}

	}
}

int main ()
{
//	freopen(".in", "r", stdin);
//	freopen(".out", "w", stdout);
	ios::sync_with_stdio(false);
	cin.tie(0);
	cout.tie(0);

	int n;

	cin >> n;

	calc (n);

	cout << "\n";

	return 0;
}

不能发AC代码

这叫题解,大哥,题解都是可以发AC代码的

sorry.