【题解】P1010 [NOIP1998 普及组] 幂次方

直接打表,不用动脑(打 表 次 方)!

思路

反正数据最大2e4也就是说超不过2^15。那么我们直接打表,从0~14都手写出来,然后把输入的数分解了之后就可以直接输出啦!

打表

	out[0] = "2(0)";
	out[1] = "2";
	out[2] = "2(2)";
	out[3] = "2(2+2(0))";
	out[4] = "2(2(2))";
	out[5] = "2(2(2)+2(0))";
	out[6] = "2(2(2)+2)";
	out[7] = "2(2(2)+2+2(0))";
	out[8] = "2(2(2+2(0)))";
	out[9] = "2(2(2+2(0))+2(0))" ;
	out[10] = "2(2(2+2(0))+2)";
	out[11] = "2(2(2+2(0))+2+2(0))" ;
	out[12] = "2(2(2+2(0))+2(2))"  ;
	out[13] = "2(2(2+2(0))+2(2)+2(0))";
	out[14] = "2(2(2+2(0))+2(2)+2)";

全部代码:

#include <cmath>
#include <iostream>
using namespace std;
const int N = 15;
int n;
string out[N];

int main()
{
	out[0] = "2(0)";
	out[1] = "2";
	out[2] = "2(2)";
	out[3] = "2(2+2(0))";
	out[4] = "2(2(2))";
	out[5] = "2(2(2)+2(0))";
	out[6] = "2(2(2)+2)";
	out[7] = "2(2(2)+2+2(0))";
	out[8] = "2(2(2+2(0)))";
	out[9] = "2(2(2+2(0))+2(0))" ;
	out[10] = "2(2(2+2(0))+2)";
	out[11] = "2(2(2+2(0))+2+2(0))" ;
	out[12] = "2(2(2+2(0))+2(2))"  ;
	out[13] = "2(2(2+2(0))+2(2)+2(0))";
	out[14] = "2(2(2+2(0))+2(2)+2)";
	cin >> n; 
	int flag = 1;
	//按数据量来看,2^15就已经大于最大值2e4,所以我们最大的可能也就2的十四次方
	//我们的 i 就从 N = 15 开始分解 
	for(int i = N; i >= 0; i--)
	{
		//拆分数变成2的多少次方的形式
		int t = pow(2, i);
		if(n - t >= 0)
		{
			n -= t;
			//第一个不需要输出加号 
			if(flag == 1)
			{
				cout << out[i];
				flag = 0;
			 } 
			//根据结果进行按表记录 
			else
			{
				cout << ('+' + out[i]);	
			 }
		}	
	}
	return 0;
}
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值