[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 1≤n≤2×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;
}
喜欢就订阅此专辑吧!
【蓝胖子编程教育简介】
蓝胖子编程教育,是一家面向青少年的编程教育平台。平台为全国青少年提供最专业的编程教育服务,包括提供最新最详细的编程相关资讯、最专业的竞赛指导、最合理的课程规划等。本平台利用趣味性和互动性强的教学方式,旨在激发孩子们对编程的兴趣,培养他们的逻辑思维能力和创造力,让孩子们在轻松愉快的氛围中掌握编程知识,为未来科技人才的培养奠定坚实基础。
欢迎扫码关注蓝胖子编程教育