C++ 2的幂次方表示
2024-08-30 09:20:29
【题目描述】
任何一个正整数都可以用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 ;
}
最新文章
- zend studio(Eclipse)和PyDev搭建Python开发环境
- Observer(观察者)-对象行为型模式
- 怎么查询电脑ip地址
- 『TCP/IP详解——卷一:协议』读书笔记——01
- Java-J2SE学习笔记-线程-生产者消费者问题
- ecshop 模板与库文件lbi
- Spring中Druid链接池的配置
- Java伪代码描述《大道至简》第一章
- 机器学习基础:(Python)训练集测试集分割与交叉验证
- 二进制学习 wsample01a.exe
- Maven传递依赖的坑:父pom中dependencyManagement版本优先级高于传递依赖版本
- jquery中把一串字符串分割,如:123456789后者abcdefg类型的
- Pandas基本功能之reindex重新索引
- 手机CPU
- [Python] 分段线性插值
- linux增加硬盘 磁盘分区格式化及挂载
- int、long、longlong、float、double、long double的范围
- Spring boot 外部资源配置
- Python开发基础-Day11内置函数补充、匿名函数、递归函数
- uGUI Anchor
热门文章
- DPDK之什么是imissed、ierrors、rx_nombuf
- 何时/如何使用 Vue3 render 函数
- 推荐IT经理/产品经理,常用工具和网站
- vue学习(八) vue中样式 class 定义引用
- Python编程入门(第3版)|百度网盘免费下载|零基础入门学习资料
- # SpringBoot-环境搭建
- nginx访问日志分析,筛选时间大于1秒的请求
- 深入理解Spring AOP 1.0
- python 安装 0x000007b错误解决及VC++ 安装第三方库报红
- 不想得手指关节炎?帮你提炼IDEA常用代码补全操作