3784 - 【START】2015暑期训练——2的次幂表示

任何一个正整数都可以用2进制表示,例如:137的2进制表示为10001001。

将这种2进制表示写成2的次幂的和的形式,令次幂高的排在前面,可得到如下表达式:137=2^7+2^3+2^0
现在约定幂次用括号来表示,即a^b表示为a(b)
此时,137可表示为:2(7)+2(3)+2(0)
进一步:7=2^2+2+2^0 (2^1用2表示)
3=2+2^0
所以最后137可表示为:2(2(2)+2+2(0))+2(2+2(0))+2(0)
又如:1315=2^10+2^8+2^5+2+1
所以1315最后可表示为:
2(2(2+2(0))+2)+2(2(2+2(0)))+2(2(2)+2(0))+2+2(0)

题目输入

输入第一行是一个整数M(0<M<=100),代表测试数据组数

接下来M行每行一个正整数(1<=n<=20000)

题目输出

针对每个输入,输出符合约定的n的0,2表示(在表示中不能有空格),以换行符结束。

输入/输出样例

题目输入

2
137
1315

题目输出

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

C语言解答

#include<stdio.h>
#include<math.h>
void fun(int n)
{
	int i;
	if(n == 3)
	printf("2+2(0)");
	else if(n == 2)
	printf("2");
	else if(n == 1)
	printf("2(0)");
	else
	{
		printf("2(");
		for(i = 14;i>=0;i--)
		if((int)pow(2,i)<=n)
		{
			fun(i); 
			break;
		}
		printf(")");
		if(n-(int)pow(2,i))
		{
			printf("+");
			fun(n-(int)pow(2,i));
		}
	}
}
int main()
{
	int t,n;
	scanf("%d",&t);
	while(t--)
	{
		scanf("%d",&n);
		fun(n);
		printf("\n");
	}
	return 0;
}

C++解答

#include<iostream>
#include<cstdio>
using namespace std;

void my_print(int n)
{
	int flag = 0;	// 标记 
	// 1 <= n <= 20000
	// 2^15次方足够存下所用数字的大小 
	for(int i = 15; i >= 0; i--)
	{
		// 利用位运算方便判断2的次幂数 
		if(n & (1<<i)) {
			// 大于2的话需要继续递归 
			if(flag) cout << "+";
			switch(i)
			{
				case 0: cout << "2(0)"; break;
				case 1: cout << "2"; break;
				case 2: cout << "2(2)"; break;
				default: 
					cout << "2(";
					my_print(i);
					cout << ")";
					break;
			}
			flag = 1;
		} 
	}
	
}

int main()
{
	
	int M;
	cin >> M;
	while(M--) {
		
		int n;	// 数字n
		cin >> n; 
	
		my_print(n);
		
		cout << endl;
	
	} 
	
	return 0;
}
时间限制 1 秒
内存限制 128 MB
讨论 统计
上一题 下一题