【题解】【分治】—— [NOIP1998 普及组] 幂次方

[NOIP1998 普及组] 幂次方

戳我查看题目(洛谷)

题目描述

任何一个正整数都可以用 2 2 2 的幂次方表示。例如 $137=27+23+2^0 $。

同时约定次方用括号来表示,即 a b a^b ab 可表示为 a ( b ) a(b) a(b)

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

进一步:

7 = 2 2 + 2 + 2 0 7= 2^2+2+2^0 7=22+2+20 ( 2 1 2^1 21 2 2 2 表示),并且 3 = 2 + 2 0 3=2+2^0 3=2+20

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

又如 1315 = 2 10 + 2 8 + 2 5 + 2 + 1 1315=2^{10} +2^8 +2^5 +2+1 1315=210+28+25+2+1

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

输入格式

一行一个正整数 n n n

输出格式

符合约定的 n n n 0 , 2 0, 2 0,2 表示(在表示中不能有空格)。

样例 #1

样例输入 #1

1315

样例输出 #1

2(2(2+2(0))+2)+2(2(2+2(0)))+2(2(2)+2(0))+2+2(0)

提示

【数据范围】

对于 100 % 100\% 100% 的数据, 1 ≤ n ≤ 2 × 10 4 1 \le n \le 2 \times {10}^4 1n2×104

NOIP1998 普及组 第三题

1.题意解析

    这是一道经典的分治。根据题意,我们定义一个递归函数dis

    首先,外层是一个while循环,用来逐步分解这个数,直到分完为止。

    然后,根据题意,我们需要找最大的小于n 2 m a x d 2^{maxd} 2maxd,再递归分解 m a x d maxd maxd

    最后,递归边界有三个,分别是:

if(n==0){cout<<0;return;}//递归边界:指数为0直接输出0 
if(n==1){return;}//递归边界:指数为1直接返回
if(n==2){cout<<2;return;}//递归边界:指数为2直接输出2

注意: 2 1 2^1 21 2 2 2 表示。所以当指数为1时,不需要输出括号和1

2.AC代码

#include<bits/stdc++.h>
using namespace std;
void dis(int n)//dis(n)代表分解数n
{
	if(n==0){cout<<0;return;}//递归边界:指数为0直接输出0 
	if(n==1){return;}//递归边界:指数为1直接返回
	if(n==2){cout<<2;return;}//递归边界:指数为2直接输出2
	int maxd;//代表分解n时小于n的最大的2的指数
	while(n)//只要n没有被分解完就继续计算
	{
		for(maxd=1;1<<maxd<=n;maxd++);//计算maxd
		maxd--;//最后总要先减1
		if(n!=0)//只要n没有被分解完就继续计算
		{
			(maxd!=1)?cout<<2<<'(':cout<<2;//只要指数不为1就输出前括号
		    dis(maxd);//分治这个指数
		    if(maxd!=1)cout<<')';//只要指数不为1就输出后括号
		    n-=1<<maxd;//自减处理完的部分
		    if(n!=0)cout<<'+';//只要n没有被分解完就输出+
		}
    }
}
int main()
{
    int n;
    cin>>n;
    dis(n);//调用递归函数
	return 0;
}

喜欢就订阅此专辑吧!

【蓝胖子编程教育简介】
蓝胖子编程教育,是一家面向青少年的编程教育平台。平台为全国青少年提供最专业的编程教育服务,包括提供最新最详细的编程相关资讯、最专业的竞赛指导、最合理的课程规划等。本平台利用趣味性和互动性强的教学方式,旨在激发孩子们对编程的兴趣,培养他们的逻辑思维能力和创造力,让孩子们在轻松愉快的氛围中掌握编程知识,为未来科技人才的培养奠定坚实基础。

欢迎扫码关注蓝胖子编程教育
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

蓝胖子教编程

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值