您的位置:首页 > 理论基础

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

2012-02-29 11:30 363 查看
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
+="2(";
				str
+=str[j];
				str
+=")";
				break;
			}
			else
			{
				if(m>=binary[j])
				{
					m-=binary[j];
					if(flag)
						str
+="+";
					str
+=str[binary[j]];
					flag=1;
				}
			}
		}
	}
	while(scanf("%d",&n)!=EOF)
	{
		cout<<str
<<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;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐