P1010 幂次方 【分治递归】
题目描述
任何一个正整数都可以用 22 的幂次方表示。例如 137=2^7+2^3+2^0137=27+23+20。
同时约定方次用括号来表示,即 a^bab 可表示为 a(b)a(b)。
由此可知,137137 可表示为 2(7)+2(3)+2(0)2(7)+2(3)+2(0)
进一步:
7= 2^2+2+2^07=22+2+20 ( 2^121 用 22 表示),并且 3=2+2^03=2+20。
所以最后 137137 可表示为 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+11315=210+28+25+2+1
所以 13151315 最后可表示为 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)。
输入格式
一行一个正整数 nn。
输出格式
符合约定的 nn 的 0, 20,2 表示(在表示中不能有空格)。
输入输出样例
输入 #1复制
1315
输出 #1复制
2(2(2+2(0))+2)+2(2(2+2(0)))+2(2(2)+2(0))+2+2(0)
思路朴素版
由题目中 1315=2^{10} +2^8 +2^5 +2+11315=210+28+25+2+1
来举例:
一.
2的10次方的10先被分解为 2的3次方+2的1次方
2(2(3))+2)
二.
2的1次方的1不用分解,而2的3次方的3再被分解为 2的1次方再加上2的0次方
2(2(2+2(0))+2)
三.
2的1次方的1不用再分解,2的0次方的0也不用再分解
2(2(2+2(0))+2)
大致可以分为
1.需要分解
2.不用再分解
2的产生:
可以发现,每一次递归都会产生一个2
最内层小括号(0)和(2)的产生:
当分解的时候发现指数与0或2相等,不需要继续分解了,就直接输出(0),(2)
外层括号的产生:
还需要再分解,递归分解的时候
printf("(");
dfs(cn);
printf(")");
递归要注意递归结束的条件
#include <iostream>
#include <algorithm>
using namespace std;
void dfs(int n)
{if(n==0)return; //递归终止的条件,被分解完毕 printf("2"); //每一次递归都以2为开头int cn=-1,e=1;while(e<=n){cn++;if(cn!=0)e=e*2; } cn--; //因为e最终的结果是大于n的,相当于cn多加了,e也 多乘了 if(cn==0||cn==2)printf("(%d)",cn);//如果cn==0,不用管,这是2(0)也就是单独一个2else if(cn>=3) //括号里面的数还要继续分解 {printf("(");dfs(cn);printf(")");} e=e/2; //e多乘了 n=n-e; //n还有没分解完的部分,也就是之前所说的括号外面的数 if(n) {printf("+"); dfs(n);}
}
int main()
{int n;cin>>n;dfs(n);
}
第二种做法 :位运算版
#include <iostream>
#include <cstdio>
using namespace std;
void dfs(int n)
{if(n==0) //递归终止的条件 {printf("0");return;}if(n==2) //递归终止的条件 {printf("2");return;}int cn=0;int pos;for(int i=0;i<=20;i++){if(n>>i&1)pos=i; //求最高位1的位置 }for(int i=pos;i>=0;i--) //从最高位开始,逆序,因为如果不逆序,结果的顺序会反过来 {if(n>>i&1){if(i==1){if(cn>=1) //cn是统计参加加法运算的项数,如果cn=1,则不需要添加+号 printf("+");printf("2");cn++;}else{if(cn>=1)printf("+");printf("2");printf("(");dfs(i);printf(")");cn++;}}}
}
int main()
{int n;cin>>n;dfs(n);
}
P1010 幂次方 【分治递归】相关推荐
- P1010 幂次方 (递归+分治)
题目描述 任何一个正整数都可以用2的幂次方表示.例如 137=2^7+2^3+2^0 同时约定方次用括号来表示,即a^b可表示为a(b). 由此可知,137可表示为: 2(7)+2(3)+2(0) 进 ...
- 【每日刷题】P1010 幂次方题解
[每日刷题]P1010 幂次方题解 题目描述 任何一个正整数都可以用 $2$ 的幂次方表示.例如 $137=2^7+2^3+2^0 $. 同时约定方次用括号来表示,即 $a^b$ 可表示为 $a(b) ...
- 洛谷 p1010 幂次方 python实现
洛谷 p1010 幂次方 python实现 描述 任何一个正整数都可以用2的幂次方表示.例如 137= 2 7 + 2 3 + 2 0 2^7+2^3+2^0 27+23+20 同时约定方次用括号来表 ...
- 洛谷P1010 幂次方(递归算法)
题目描述 任何一个正整数都可以用 22 的幂次方表示.例如 137=2^7+2^3+2^0137=27+23+20. 同时约定方次用括号来表示,即 a^bab 可表示为 a(b)a(b). 由此可知, ...
- P1010 幂次方 P1022 计算器的改良
P1010 幂次方 一.题目 https://www.luogu.org/problemnew/show/P1010 二.代码 #include<bits/stdc++.h> using ...
- 洛谷 p1010 幂次方
#include <cstdio> #include <cmath> using namespace std; void dg(int n) {int a;if(n==0) r ...
- 【洛谷】P1010 幂次方
[NOIP1998 普及组] 幂次方 题目描述 任何一个正整数都可以用 222 的幂次方表示.例如 $137=27+23+2^0 $. 同时约定方次用括号来表示,即 aba^bab 可表示为 a(b) ...
- 洛谷-P1010 幂次方
题目描述 任何一个正整数都可以用 22 的幂次方表示.例如 137=2^7+2^3+2^0137=27+23+20. 同时约定方次用括号来表示,即 a^bab 可表示为 a(b)a(b). 由此可知, ...
- 洛谷p1010 幂次方
题目: 这道题其实就是一个简单的进制转换问题,分析一下可能出现的各种情况即可这里需要注意的就是数字2输出的就是2,而很多算法可能会输出2(2(0))也就是2^1,处理细节到1,2还有3即可,直接上代码 ...
最新文章
- 帝国cms微信小程序多语言相亲交友制作记录难点使用的小程序组件分析
- 安全的SD-WAN是如何工作?—Vecloud
- 将字符串型转换为整形
- 【深度学习】在PyTorch中使用 LSTM 进行新冠病例预测
- Android开发之如何保证Service不被杀掉(前台服务)
- .NET的一点历史故事:误入歧途,越陷越深
- 使用Lambda,Api Gateway和CloudFormation在AWS云上使用Java
- 利用anaconda prompt打开jupyter notebook
- 四川大学计算机应用基础第二次,四川大学川成教2017年秋季《计算机应用基础》第二次作业...
- TokenInsight:BTC新增流量小幅下降,链上活跃度平稳
- 图谱特征与卷积神经网络的名优大米无损鉴别
- LNMP环境下搭建wordpress
- veevalidate的使用3.X版本
- csv可以保存特殊字符_浅谈CSV注入漏洞
- CTreeCtrl 类的InsertItem成员函数
- Latex英文论文模板汇总(elsevier、arXiv、IEEE Access)
- uniapp开发微信小程序,主包(分包超过限制)
- 简易歌曲推荐网页制作
- 在职研一英语课件难句整理
- 上海始终未出现真正“富人区”