【题目描述】

任何一个正整数都可以用2的幂次方表示。例如:

137=27+23+20

同时约定方次用括号来表示,即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)

思路:

这道题的大体思路就是把所输入的数全部用2进制数来表示,既然要用2进制的数把输入的数拆分,就想到了用递归函数。

①先创建一个数组a,数组中的数的位置分别是2的几次幂。因为输入的数n小于等于20000也就是小于2^15,所以就创建数组15个数。

②先找出数组a中小于n的最大的数的位数k,之后对k分析。

③如果k=0、1、2分别输出2(0)、2(1)、2(2)。

④如果k>2的话就说明输出的数不能直接表达出来了,就要再次分解,所以先输入2(),括号里的数需要再次分解,递归函数就可以了。

⑤考虑完分解的第一个数之后,就开始对第二个数开始分析,如果存在第二个数就输出+,讲n-第一个数的值放到函数中。随后依次类推到没有余数就结束了。

代码:

#include <iostream>
int a[];
using namespace std;
void two(int n)
{
int k;
for (k = ;k>=;--k)
{
if (a[k] <= n) break;
}
if (k == ) cout << "2(0)";
else if (k == ) cout << "";
else if (k == ) cout << "2(2)";
else {
cout << "2(";
two(k);
cout << ")";
}
if (a[k] < n)
{
cout << "+";
two(n - a[k]);
}
}
int main() { a[] = ;
for (int i = ;i < ;++i)
{
a[i] = * a[i - ];
}
int n;
cin >> n;
two(n); return ;
}

最新文章

  1. zend studio(Eclipse)和PyDev搭建Python开发环境
  2. Observer(观察者)-对象行为型模式
  3. 怎么查询电脑ip地址
  4. 『TCP/IP详解——卷一:协议』读书笔记——01
  5. Java-J2SE学习笔记-线程-生产者消费者问题
  6. ecshop 模板与库文件lbi
  7. Spring中Druid链接池的配置
  8. Java伪代码描述《大道至简》第一章
  9. 机器学习基础:(Python)训练集测试集分割与交叉验证
  10. 二进制学习 wsample01a.exe
  11. Maven传递依赖的坑:父pom中dependencyManagement版本优先级高于传递依赖版本
  12. jquery中把一串字符串分割,如:123456789后者abcdefg类型的
  13. Pandas基本功能之reindex重新索引
  14. 手机CPU
  15. [Python] 分段线性插值
  16. linux增加硬盘 磁盘分区格式化及挂载
  17. int、long、longlong、float、double、long double的范围
  18. Spring boot 外部资源配置
  19. Python开发基础-Day11内置函数补充、匿名函数、递归函数
  20. uGUI Anchor

热门文章

  1. DPDK之什么是imissed、ierrors、rx_nombuf
  2. 何时/如何使用 Vue3 render 函数
  3. 推荐IT经理/产品经理,常用工具和网站
  4. vue学习(八) vue中样式 class 定义引用
  5. Python编程入门(第3版)|百度网盘免费下载|零基础入门学习资料
  6. # SpringBoot-环境搭建
  7. nginx访问日志分析,筛选时间大于1秒的请求
  8. 深入理解Spring AOP 1.0
  9. python 安装 0x000007b错误解决及VC++ 安装第三方库报红
  10. 不想得手指关节炎?帮你提炼IDEA常用代码补全操作