2006年上海交通大学计算机研究生机试真题

http://ac.jobdu.com/problem.php?pid=1095 2的幂次方

//手动模拟
#include<iostream>
#include<string>
#include<cstdio>
using namespace std;

int main(void)
{
	int j,n,flag,m;
	int binary[15]={1,2,4,8,16,32,64,128,256,512,1024,2048,4096,8192,16384};
	string str[20001];
	str[1]="2(0)";
	str[2]="2";
	for(n=3;n<20001;n++)
	{
		flag=0,m=n;
		for(j=14;j>=0;j--)
		{
			if(binary[j]>n)
				continue;
			else if(binary[j]==n)
			{
				str[n]+="2(";
				str[n]+=str[j];
				str[n]+=")";
				break;
			}
			else
			{
				if(m>=binary[j])
				{
					m-=binary[j];
					if(flag)
						str[n]+="+";
					str[n]+=str[binary[j]];
					flag=1;
				}
			}
		}
	}
	while(scanf("%d",&n)!=EOF)
	{
		cout<<str[n]<<endl;
	}
	return 0;
}

方法二:

//递归
#include<iostream>
#include<string>
#include<cstdio>
using namespace std;

void dfs(int n)
{
	int i=0,binary[15];
	bool add;
	if(n==0)
	{
		printf("0");
		return ;
	}
	else if(n==1)
	{
		printf("2");
		return ;
	}
	while(n)
	{
		if(n&1)
			binary[i++]=1;
		else
			binary[i++]=0;
		n>>=1;
	}
	add=false,i--;
	for(;i>=0;i--)
	{
		if(binary[i])
		{
			if(add)
				printf("+");
			if(i>=2)
			{
				printf("2(");
				dfs(i);
				printf(")");
			}
			else if(i==1)
				printf("2");
			else if(i==0)
				printf("2(0)");
			add=true;
		}
	}
}
int main(void)
{
	int n;
	while(scanf("%d",&n)!=EOF)
	{
		dfs(n);
		printf("\n");
	}
	return 0;
}


 

你可能感兴趣的:(String,交通,n2)