2333 - 二的幂次方

通过次数

0

提交次数

0

时间限制 : 1 秒 内存限制 : 125 MB

任何一个正整数都可以用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


题目输入

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


题目输出

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


输入/输出样例

输入格式

137

输出格式

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

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);
}

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;
}

Java解答

import java.util.Scanner;

public class Main {
	public static void main(String[] args) {
		String str = "";

		Scanner scan = new Scanner(System.in);
		int num = scan.nextInt();
		scan.close();
		String res = doWhile(num, str);
		System.out.println(res);
	}

	private static String doWhile(int num, String str) {
		int product = 1, n = 0;

		if (num == 1) {
			return "2(0)";
		} else if (num == 2) {
			return "2";
		}

		while (product * 2 <= num) {
			product *= 2;
			++n;
		}
		if (num - product != 0) {
			int diff = num - product;
			str = "2(" + doWhile(n, str) + ")+" + doWhile(diff, str);
		} else {
			str = "2(" + doWhile(n, str) + ")";
		}
		str = str.replace("2(2(0))", "2");
		return str;
	}
}