[Wikioi 2808][NOIP 1998普及组]二的幂次方---HBNU的童鞋过来看看

24 篇文章 1 订阅

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

正整数n

符合约定的n的0,2表示(在表示中不能有空格)

【输入样例1】
137
【输入样例2】
1315

【输出样例1】
2(2(2)+2+2(0))+2(2+2(0))+2(0)
【输出样例2】
2(2(2+2(0))+2)+2(2(2+2(0)))+2(2(2)+2(0))+2+2(0)

n为2的指数<=1100586419200

没想到昨晚的HBNU校内赛居然出了这道题,实在出乎我的意料,今天又仔细琢磨了下这题,作为昨晚唯一AC的人给HBNU的童鞋们分享下我的代码

此题延续了NOIP普及组恶心的字符串内容,加上DFS就成了这个题,这个题最简便的方法不是对数字n不停地Mod2、除2,而是使用位运算,因为此题只要求输出2的0次方和1次方,十进制转二进制后就能得到这个结果,很方便,每次判断条件后左移1位,2的指数不是0或1就继续深搜

最后注意下数据范围,要用long long int,否则会挂大数据

#include <stdio.h>
#define LONG long long int
#define LEN 64
void dfs(LONG in) //in=上一级转换下来要拆开的数
{
	LONG i,j,flag=0;
	for(i=0;i<LEN;i++)
	{
		if(in<0)
		{
			if(flag>0)
				printf("+"); //不是等号后第一个数,先补上加号
			else
				flag=1;
			if(LEN-i-1==1) //2^1
				printf("2");
			else	//这个2的幂不是1,则需要打印出“2( )”
			{
				printf("2("); //先打印左边
				if(LEN-i-1==0)
					printf("0");
				else
					dfs(LEN-i-1);
				printf(")");
			}
		}
		in=in<<1; //in左移一位, in<<1 <==> in/2
	}
}
int main()
{
	LONG n,i,j;
	scanf("%lld",&n);
	dfs(n);
	return 0;
}


 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值