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 普及组] 幂次方 题解相关推荐

  1. 洛谷P1010 [NOIP1998 普及组] 幂次方题解

    数论递归 题目描述 任何一个正整数都可以用2的幂次方表示.例如137=27+23+20. 同时约定方次用括号来表示,即ab可表示为 a(b). 由此可知,137可表示为2(7)+2(3)+2(0). ...

  2. 洛谷P1010 [NOIP1998 普及组] 幂次方 题解

    题目 C++: #include<bits/stdc++.h> using namespace std; string run(int x,int i=0,string s=string( ...

  3. 信息学奥赛一本通 1208:2的幂次方表示 | OpenJudge 2.2 8758:2的幂次方表示 | 洛谷 P1010 [NOIP1998 普及组] 幂次方

    [题目链接] ybt 1208:2的幂次方表示 OpenJudge 2.2 8758:2的幂次方表示 洛谷 P1010 [NOIP1998 普及组] 幂次方 [题目考点] 1. 递归 [解题思路] 递 ...

  4. 洛谷——P1010 [NOIP1998 普及组] 幂次方

    P1010 [NOIP1998 普及组] 幂次方 题目描述 任何一个正整数都可以用 22 的幂次方表示.例如 137=27+23+2^0137=27+23+20. 同时约定方次用括号来表示,即 a^b ...

  5. 洛谷P1010 [NOIP1998 普及组] 幂次方

    文章目录 前言 题目描述 输入格式 输出格式 样例 #1 样例输入 #1 样例输出 #1 [数据范围] 代码 解析 结尾 前言 在做完洛谷P1010 [NOIP1998 普及组] 幂次方这道题之后,我 ...

  6. 洛谷P1010 [NOIP1998 普及组] 幂次方 C语言/C++

    [NOIP1998 普及组] 幂次方 题目描述 任何一个正整数都可以用 2 2 2 的幂次方表示.例如 $137=27+23+2^0 $. 同时约定方次用括号来表示,即 a b a^b ab 可表示为 ...

  7. 洛谷千题详解 | P1010 [NOIP1998 普及组] 幂次方【C++、Java、Python、Pascal语言】

    博主主页:Yu·仙笙 专栏地址:洛谷千题详解 目录 题目描述 输入格式 输出格式 输入输出样例 解析: C++源码: Pascal源码: Java源码: Python源码: ------------- ...

  8. P1010 [NOIP1998 普及组] 幂次方 递归模拟

    题目描述 任何一个正整数都可以用 2 的幂次方表示.例如 137=2^7+2^3+2^0 同时约定方次用括号来表示,即 a^b可表示为a(b). 由此可知,137 可表示为 2(7)+2(3)+2(0 ...

  9. 洛谷 P1010 [NOIP1998 普及组] 幂次方

    题目链接 题目大意 任何一个正整数都可以用 2 的幂次方表示.例如 137=27+23+20.137=2^7+2^3+2^0.137=27+23+20. 输入一个整数n,用0和2的二进制表示该整数n. ...

最新文章

  1. 使用.net开发手机管理软件 (七) IrMC简介
  2. Ctrl+E快捷键,一键批量解决Excel中90%的问题!
  3. 接口隔离原则_设计模式六大原则
  4. 给你汇报Struts2 S2-016漏洞修复的总结
  5. api 请求 fail_谈一谈定位api的使用
  6. shell 判断字符串是否存在包含关系
  7. java锁对象的区别吗_Java中对象级别锁和类级别锁之间的区别
  8. NOIP2016-D2-T2 蚯蚓(单调队列)
  9. HDU 1117 免费馅饼 二维动态规划
  10. win10下JDK安装,配置环境变量后出现error:could not open '...jvm.cfg'
  11. 从数据黑盒到数据白盒,阿里云基础产品首席架构师黄瑞瑞分享背后的故事
  12. python模拟登陆豆瓣_模拟登陆豆瓣并爬取个人主页(爬虫项目三)
  13. mac怎么禁止某个应用联网?
  14. zblog自动采集伪原创站群文章更新器
  15. oracle client 是什么,Oracle数据库与客户端有什么区别
  16. 将win7笔记本电脑变身WiFi热点,让手机、笔记本共享上网
  17. win10系统装服务器2008蓝屏,win10蓝屏 重装系统还是蓝屏
  18. Notion中的Tex数学表达式(完整版)
  19. 中国天眼新发现登Nature封面:恒星形成速度比我们想象快10倍
  20. 从JMM到CAID再到分布式事务-1

热门文章

  1. OpenCV中threshold自动阈值,类似matlab中的graythresh
  2. EOS智能合约开发(三)EOS创建和管理账户
  3. 如何恢复已删除的文件:终极指南
  4. hive常用的函数以及知识
  5. MySQL数据库操作-查看数据库 (SHOW DATABASES)
  6. python学习手册教程_python学习手册:如何学习python学习教程?
  7. 远端rlogin服务
  8. 如何在 Vim 中用换行符替换字符
  9. 机器学习(一):模型的参数估计方法
  10. Signal:python用信号处理程序的机制及用法举例