欢迎使用CSDN-markdown编辑器
来源:互联网 发布:淘宝上亚马逊会员代买 编辑:程序博客网 时间:2024/05/29 13:10
题目描述:
任何一个正整数都可以用2的幂次方表示。例如:
137=2^7+2^3+2^0
同时约定方次用括号来表示,即ab可表示为a(b)。由此可知,137可表示为:
2(7)+2(3)+2(0)
进一步:7=22+2+20(21用2表示)
3=2+20
所以最后137可表示为:
2(2(2)+2+2(0))+2(2+2(0))+2(0)
又如:
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)
输入
一个正整数n(n≤20000)。
输出
一行,符合约定的n的0,2表示(在表示中不能有空格)。
样例输入
137
样例输出
2(2(2)+2+2(0))+2(2+2(0))+2(0)
来源
NOIP1998复赛 普及组 第一题
分析:
从题目可以知道,输入的数据137先按指数从大到小分为2(7)+2(3)+2(0),然后再将指数按上面同样的方法分为2(2)+2+2(0),2+2(0),0,就可得出 最后结果2(2(2)+2+2(0))+2(2+2(0))+2(0)。显然,这道题应该运用递归。
不妨设要进行这种最后运算的数为递归的出口是s,显然递归出口有两种情况s == 1 或者s == 2
s == 1,那么输出2(0)
s == 2 那么输出2
那么下面就是如何将大于2的数进行转换的问题了
因为题目涉及2的幂次方,因此要首先计算大于s的的最小的2^n的数,记为p,并记录指数为s。为了达到这个目的,可以采用while循环,代码如下:
int p = 1; int s = 0; //用来求指数 while(p<=n) //这里写带等号的话,比较方便后面的计算; { p = p*2; s++; } s--; //因为p已经大于n了,因此p/2的指数,也就是s-1就是最接近s的指数
这是求最大指数,然后很显然就是拿s减去p/2,然后进行同样的操作。不过这里要注意下,从题目,题目看,2不能写成2(2(0)),因此要 考虑p == 4这种情况,代码如下:
if(n == p/2) //用数学语言将就是对n以2为底取对数,得到的是整数 { cout << "2("; resolve(s); cout << ")"; } else { if(p == 4) //这是特殊情况,如果没有这句,就会出现2(2(0)这种奇葩形式 { cout << "2+"; resolve(n-p/2); } else { cout << "2("; resolve(s); cout << ")+"; resolve(n-p/2); } }
附上全部代码
#include<iostream>using namespace std;void resolve(int n);int main(void){ int n; cin >> n; resolve(n); return 0;}void resolve(int n){ if(n == 1) //递归出口1 { cout << "2(0)"; return; } if(n == 2) //递归出口2 { cout << "2"; return; } int p = 1; int s = 0; //用来求最大幂 while(p<=n) //循环结束后,p>n; { p = p*2; s++; } s--; if(n == p/2) { cout << "2("; resolve(s); cout << ")"; } else { if(p == 4) //这是特殊情况,如果没有这句,就会出现2(2(0)这种奇葩形式 { cout << "2+"; resolve(n-p/2); } else { cout << "2("; resolve(s); cout << ")+"; resolve(n-p/2); } }}
如有错误,恳请指点,O(∩_∩)O谢谢
阅读全文
0 0
- 欢迎使用CSDN-markdown编辑器
- 欢迎使用CSDN-markdown编辑器
- 欢迎使用CSDN-markdown编辑器
- 欢迎使用CSDN-markdown编辑器
- 欢迎使用CSDN-markdown编辑器
- 欢迎使用CSDN-markdown编辑器
- 欢迎使用CSDN-markdown编辑器
- 欢迎使用CSDN-markdown编辑器
- 欢迎使用CSDN-markdown编辑器
- 欢迎使用CSDN-markdown编辑器
- 欢迎使用CSDN-markdown编辑器
- 欢迎使用CSDN-markdown编辑器
- 欢迎使用CSDN-markdown编辑器
- 欢迎使用CSDN-markdown编辑器
- 欢迎使用CSDN-markdown编辑器
- 欢迎使用CSDN-markdown编辑器
- 欢迎使用CSDN-markdown编辑器
- 欢迎使用CSDN-markdown编辑器
- 金蝶K3数据库表名对应及表说明
- 神经网络反向传播时的梯度
- 3D 激光SLAM ->loam_velodyne论文与代码解析Lidar Odometry and Mapping
- Unity的内存优化以及在移动平台上的优化
- HTTP请求
- 欢迎使用CSDN-markdown编辑器
- Linux 高可用集群
- 约瑟夫问题(环形链表解题)
- 操作文件和目录
- php-cgi php-fpm说明
- 英文禁止溢出/ios自带美化去除/ios兼容go(-1)问题
- ZOJ
- Windows命令行查看文件的MD5 和win10下获取md5-sha1
- NKOJ 4042 (CQOI 2017) 老C的方块(最小割+染色)