游客 Signup | Login
中文 | En

2333 - 二的幂次方

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

例如:

            137=27+23+20

同时约定次方用括号来表示,即ab可表示为ab)。

由此可知,137可表示为:

            27+23+20

进一步:7= 22+2+20212表示)

            3=2+20  

所以最后137可表示为:

            222+2+20))+22+20))+20

又如:

            1315=210 +28 +25 +2+1

所以1315最后可表示为:

            222+20))+2+222+20)))+222+20))+2+20


Input

每个测试文件只包含一组测试数据,每组输入一个正整数n(n<=20000)。


Output

对于每组输入数据,输出符合约定的n的0,2表示。(在表示中不能有空格)


Examples

Input

137

Output

2(2(2)+2+2(0))+2(2+2(0))+2(0)

Solution C

#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<math.h>
 
 
void work(int n)
{
	if(n==1)//初始判断条件,如果n为1或2则直接输出 
	{
		printf("2(0)");
		return;
	}
	else if(n==2)
	{
		printf("2");
		return; 
	} 
	else
	{
		int j=1,i=0;//j每次乘2,如果大于了n就分解结束,i为当前次数 
		do
		{
			j*=2;
			if(j>n)
			{
				j/=2;
				if(i==1)//这步非常重要,确定是否需要继续 2() 
					printf("2");
				else
				{
					printf("2(");
					work(i);
					printf(")");
				}	
				if(n-j!=0)//如果n分解之后还有剩余的数,那么继续分解 
				{
					printf("+");
					work(n-j);
				}
				return;
			}
			else
				i++;
			
			
		}while(1);
	}	
					
	
}
 
int main()
{
	int n;
	scanf("%d",&n);
	work(n);
}

Solution C++

#include<iostream>
#include<cstdio>
#include<cmath>
using namespace std;
void print(int n)
{
    int p=0;
    while((1<<p)<=n) p++;
    p--;
    if(p==0) printf("2(0)");
    else if(p==1) printf("2");
    else
    {
        printf("2(");
        print(p);
        printf(")");
    }
    int remain=n-(1<<p);
    if(remain)
    {
        printf("+");
        print(remain);
    }
}
int main()
{
    int n;
    while(~scanf("%d",&n))
    {
        print(n);
        printf("\n");
    }
    return 0;
}

Time Limit 1 second
Memory Limit 125 MB
Discuss Stats
上一题 下一题