码迷,mamicode.com
首页 > 其他好文 > 详细

【题解】二的幂次方

时间:2019-04-18 13:29:37      阅读:144      评论:0      收藏:0      [点我收藏+]

标签:clu   als   str   reg   return   turn   while   names   输出   

题目描述

任何一个正整数都可以用2的幂次方表示。例如:137=27+23+2027+23+20,同时约定次方用括号来表示,即abab可表示为a(b)。

由此可知,137可表示为:2(7)+2(3)+2(0),进一步:7=22+2+2022+2+20(2121用2表示),3=2+202+20, 所以最后137可表示为:2(2(2)+2+2(0))+2(2+2(0))+2(0)。

又如:1315=210+28+25+2+1210+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)

输入样例二:

1315

输出样例二:

2(2(2+2(0))+2)+2(2(2+2(0)))+2(2(2)+2(0))+2+2(0)
首先,如何把一个数转成二的幂次方表示形式呢?
先把这个数转成二进制,例如3可以转为11,按权值展开可得2+2(0),然后再用递归再把次方数转二进制,以此类推
具体程序如下:

#include<iostream>
#include<cstdio>
using namespace std;
void f(int num)
{   
    int b[100000]={},c=0;
    bool check=false;
    if(num==0) {cout<<0; return;}
    if(num==1) {cout<<"2(0)"; return;}
    if(num==2) {cout<<"2"; return;}
    while(num!=0)
    {
        b[c]=num%2;
        num/=2;
        c++;
    }
    for(register int i=c-1;i>=0;--i)
    {
        if(b[i]==1)
        {
            if(!check)
            {
                if(i==1)
                {
                    cout<<"2";
                    check=true;
                    continue;
                }
                cout<<"2(";
                f(i);
                cout<<")";
                check=true;
            }
            else
            {
                if(i==1)
                {
                    cout<<"+2";
                    continue;
                }
                cout<<"+2(";
                f(i);
                cout<<")";
            }
        }
    }
}
int main()
{
    int x=0;
    cin>>x;
    f(x);
}

【题解】二的幂次方

标签:clu   als   str   reg   return   turn   while   names   输出   

原文地址:https://www.cnblogs.com/2021-yanghaoran/p/10729020.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!