P1010 [NOIP1998 普及组] 幂次方 题解
P1010 [NOIP1998 普及组] 幂次方 题解
题目描述
任何一个正整数都可以用 2 的幂次方表示。例如 137 = 2 7 + 2 3 + 2 0 。 137=2^7+2^3+2^0。 137=27+23+20。
同时约定方次用括号来表示,即 a b a^b ab 可表示为 a ( b ) a(b) a(b)。
由此可知,137 可表示为 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 表示),并且 3 = 2 + 2 0 3=2+2^0 3=2+20。
所以最后 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)。
又如 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 最后可表示为 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 的 0, 2 表示(在表示中不能有空格)。
输入输出样例
输入 #1复制
1315
输出 #1复制
2(2(2+2(0))+2)+2(2(2+2(0)))+2(2(2)+2(0))+2+2(0)
说明/提示
【数据范围】
对于 100% 的数据, 1 ≤ n ≤ 2 × 10 4 1 \le n \le 2 \times {10}^4 1≤n≤2×104。
题解思路:
记得这道题当初是做过的,好像是准备蓝桥杯的期间做的,由于当时的基础很薄弱,c++只学会了基本语法,所以是用纯模拟来做的。
现在又在洛谷上跳题跳到这个上了,一看题:2的n次方balabala,就想到了二进制,所以这次就用位运算来做。
这是道入门递归的好题,同时也是入门位运算的好题。
步骤如下:
1.对输入数字的二进制数逐位扫描,若为1则记录下当前的位数,因为若二进制下当前位为1的话,是可以用2的位数次方来表示的。
2.对录入的位数反序扫描(步骤1是从低位到高位记录的位数,而要保证为高位到低位输出,所以要反序),然后处理三种情况:
(一)位数为0,实际输出格式为 2(0)
(二)位数为1,实际输出格式为 2
(三)位数为其他,则按题目要求转化为(一)(二)的情况,即对该位数进行同样的拆解,实际操作上就是再调用该处理函数进行处理(即递归)。
这样就顺利解决了。
最后附上代码:
#include<bits/stdc++.h>//STL的催肥机
using namespace std;#define ll long long
#define INF 0x3f3f3f3fvoid produce(int n){vector<int> bit;//用于存储位数int i = 0;while(n > 0){//对数字进行位移扫描,如果为1则存储位数if(n & 1) bit.emplace_back(i);//n & 1表示,n的第一位如果,是1则会返回1,为0则会返回0n >>= 1;//向右位移一位i++;}//输出for(i = bit.size() - 1;i >= 0;i--){if(bit[i] != 1){//如果位数不为一cout << "2(";if(bit[i] == 0) cout << "0"; //如果位数为零,则输出格式 2(0)else produce(bit[i]);//其他位数则继续调用produce转化为位数为零或者一为止cout << ")";}else cout << "2";//如果为一,则输出格式 2cout << (i == 0 ? "" : "+");}
}int main(){ios::sync_with_stdio(0);cin.tie(0);int n;cin >> n;produce(n);return 0;
}
P1010 [NOIP1998 普及组] 幂次方 题解相关推荐
- 洛谷P1010 [NOIP1998 普及组] 幂次方题解
数论递归 题目描述 任何一个正整数都可以用2的幂次方表示.例如137=27+23+20. 同时约定方次用括号来表示,即ab可表示为 a(b). 由此可知,137可表示为2(7)+2(3)+2(0). ...
- 洛谷P1010 [NOIP1998 普及组] 幂次方 题解
题目 C++: #include<bits/stdc++.h> using namespace std; string run(int x,int i=0,string s=string( ...
- 信息学奥赛一本通 1208:2的幂次方表示 | OpenJudge 2.2 8758:2的幂次方表示 | 洛谷 P1010 [NOIP1998 普及组] 幂次方
[题目链接] ybt 1208:2的幂次方表示 OpenJudge 2.2 8758:2的幂次方表示 洛谷 P1010 [NOIP1998 普及组] 幂次方 [题目考点] 1. 递归 [解题思路] 递 ...
- 洛谷——P1010 [NOIP1998 普及组] 幂次方
P1010 [NOIP1998 普及组] 幂次方 题目描述 任何一个正整数都可以用 22 的幂次方表示.例如 137=27+23+2^0137=27+23+20. 同时约定方次用括号来表示,即 a^b ...
- 洛谷P1010 [NOIP1998 普及组] 幂次方
文章目录 前言 题目描述 输入格式 输出格式 样例 #1 样例输入 #1 样例输出 #1 [数据范围] 代码 解析 结尾 前言 在做完洛谷P1010 [NOIP1998 普及组] 幂次方这道题之后,我 ...
- 洛谷P1010 [NOIP1998 普及组] 幂次方 C语言/C++
[NOIP1998 普及组] 幂次方 题目描述 任何一个正整数都可以用 2 2 2 的幂次方表示.例如 $137=27+23+2^0 $. 同时约定方次用括号来表示,即 a b a^b ab 可表示为 ...
- 洛谷千题详解 | P1010 [NOIP1998 普及组] 幂次方【C++、Java、Python、Pascal语言】
博主主页:Yu·仙笙 专栏地址:洛谷千题详解 目录 题目描述 输入格式 输出格式 输入输出样例 解析: C++源码: Pascal源码: Java源码: Python源码: ------------- ...
- P1010 [NOIP1998 普及组] 幂次方 递归模拟
题目描述 任何一个正整数都可以用 2 的幂次方表示.例如 137=2^7+2^3+2^0 同时约定方次用括号来表示,即 a^b可表示为a(b). 由此可知,137 可表示为 2(7)+2(3)+2(0 ...
- 洛谷 P1010 [NOIP1998 普及组] 幂次方
题目链接 题目大意 任何一个正整数都可以用 2 的幂次方表示.例如 137=27+23+20.137=2^7+2^3+2^0.137=27+23+20. 输入一个整数n,用0和2的二进制表示该整数n. ...
最新文章
- 使用.net开发手机管理软件 (七) IrMC简介
- Ctrl+E快捷键,一键批量解决Excel中90%的问题!
- 接口隔离原则_设计模式六大原则
- 给你汇报Struts2 S2-016漏洞修复的总结
- api 请求 fail_谈一谈定位api的使用
- shell 判断字符串是否存在包含关系
- java锁对象的区别吗_Java中对象级别锁和类级别锁之间的区别
- NOIP2016-D2-T2 蚯蚓(单调队列)
- HDU 1117 免费馅饼 二维动态规划
- win10下JDK安装,配置环境变量后出现error:could not open '...jvm.cfg'
- 从数据黑盒到数据白盒,阿里云基础产品首席架构师黄瑞瑞分享背后的故事
- python模拟登陆豆瓣_模拟登陆豆瓣并爬取个人主页(爬虫项目三)
- mac怎么禁止某个应用联网?
- zblog自动采集伪原创站群文章更新器
- oracle client 是什么,Oracle数据库与客户端有什么区别
- 将win7笔记本电脑变身WiFi热点,让手机、笔记本共享上网
- win10系统装服务器2008蓝屏,win10蓝屏 重装系统还是蓝屏
- Notion中的Tex数学表达式(完整版)
- 中国天眼新发现登Nature封面:恒星形成速度比我们想象快10倍
- 从JMM到CAID再到分布式事务-1