• 【题解】二的幂次方


    题目描述

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

    由此可知,137可表示为:2(7)+2(3)+2(0),进一步:7=22+2+2022+2+20((2^1)用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);
    }
    
  • 相关阅读:
    JavaScript之MV*模式
    JavaScript之命名空间模式 浅析
    设计模式漫谈
    JavaScript之作用域与闭包详解
    JavaScript数据检测
    Code Conventions for the JavaScript Programming Language
    Javascript之对象的继承
    多线程,进程,协程用法
    scrapy_redis 实现多进程配置部分代码
    自己设计代理IP池
  • 原文地址:https://www.cnblogs.com/2021-yanghaoran/p/10729020.html
Copyright © 2020-2023  润新知