C++ 2的幂次方表示

Wesley13
• 阅读 678

【题目描述】

任何一个正整数都可以用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[15];
using namespace std;
void two(int n)
{
    int k;
    for (k = 14;k>=0;--k)
    {
        if (a[k] <= n) break;
    }
    if (k == 0)  cout << "2(0)";
    else if (k == 1) cout << "2";
    else if (k == 2) cout << "2(2)";
    else {
        cout << "2(";
        two(k);
        cout << ")";
    }
    if (a[k] < n)
    {
        cout << "+";
        two(n - a[k]);
    }
 }
int main() {
    
    a[0] = 1;
    for (int i = 1;i < 15;++i)
    {
        a[i] = 2 * a[i - 1];
    }
    int n;
    cin >> n;
    two(n);

    return 0;
}
点赞
收藏
评论区
推荐文章
晴空闲云 晴空闲云
2年前
css中skew实现元素倾斜
css中可以用transform可以实现元素2D、3D的一些变化,其中有一个变化倾斜可以用skew实现。skew语法skew语法:cssskew(ax,ay)其中:1.ax表示在x轴上的倾斜角度,单位为deg。2.ay表示在y轴上的倾斜角度,单位为deg。x轴倾斜示例1,x轴上倾斜30deg:html.boxwid
Wesley13 Wesley13
3年前
java b2b2c商城
一、需求分析1.买家可以对商品提交购买问题咨询,买家提交的商品购买咨询不单单商家可以进行回复,也应该可以将问题推送给购买过此商品的买家来进行回复。2.买家提出的咨询和对其他买家咨询的回复,都应该推送消息给相应的会员用户,做到及时提醒。二、流程图!在这里插入图片描述(https://img
Wesley13 Wesley13
3年前
java入门笔记
System.out.println();输出int整数类型不能以数字开头区分大小写inta0int的范围2的31次方到2的31次方21亿左右2个int型运算后仍为int除法没有余数14/52%模运算14%54求余数.
Wesley13 Wesley13
3年前
hdu2204 Eddy's爱好
原题:点击打开链接(https://www.oschina.net/action/GoToLink?urlhttp%3A%2F%2Facm.hdu.edu.cn%2Fshowproblem.php%3Fpid%3D2204)题意很明确了,即:给你一个正整数N,确定在1到N之间有多少个可以表示成M^K(K1)的数。本题目为容斥原
Stella981 Stella981
3年前
Eigen库
MatrixXd表示任意size的矩阵,元素类型为double;VectorXd表示任意size的向量,元素类型为double.//创建31的向量v,并赋值为1,2,3VectorXdv(3);v<<1,2,3;使用固定尺寸的Matrix,Vector相比于可变尺寸的Matrix,Vector,例如Matri
Stella981 Stella981
3年前
Hacker News 简讯 2021
!(https://oscimg.oschina.net/oscnet/up3b137e2e6620f7a63f11a96485b1fb3b.png)最后更新时间:2021011823:00
Wesley13 Wesley13
3年前
Oracle一张表中实现对一个字段不同值和总值的统计(多个count)
需求:统计WAIT\_ORDER表中的工单总数、未处理工单总数、已完成工单总数、未完成工单总数。表结构:为了举例子方便,WAIT\_ORDER表只有两个字段,分别是ID、STATUS,其中STATUS为工单的状态。1表示未处理,2表示已完成,3表示未完成总数。 SQL:  1.SELECT   2
Stella981 Stella981
3年前
Hacker News 简讯 2020
!(https://oscimg.oschina.net/oscnet/up3b137e2e6620f7a63f11a96485b1fb3b.png)最后更新时间:2020082623:00
Stella981 Stella981
3年前
Base64 的原理、实现及应用
Base64编码是基于64个字符(字符分别为:ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxzy0123456789/)的编码方式,因为2的6次方正好为64,所以我们用6bit就可以表示出64个字符,eg:000000对应'A',000001对应'B',111111对应'/'。转换表如下:
Stella981 Stella981
3年前
LeetCode 42. 接雨水
给定 _n_ 个非负整数表示每个宽度为1的柱子的高度图,计算按此排列的柱子,下雨之后能接多少雨水。!(https://oscimg.oschina.net/oscnet/b0cc4f8b9a129e159dc6141c019d5b3c043.png)上面是由数组\0,1,0,2,1,0,1,3,2,1,2,1\表示的高度图,在这种情况