洛谷p1010幂次方(分治加递归)

该博客介绍了如何解决洛谷平台上的问题p1010,主要提供了两种方法。第一种方法是采用分治与递归相结合的策略,代码实现简洁。第二种方法则是通过预先计算表格,但作者认为这种方法并不具有趣味性,更倾向于使用分治递归的正解。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

洛谷p1010幂次方(分治加递归)题目链接
方法一:分治加递归
代码如下

#include<cstdio>
#include<iostream>
const int maxx=50;
using namespace std;
int number[maxx];
//number代表存着2的倍数值的数组 
int dfs(int n)
{
	int j=0;
	if(n!=0)
	{
		while(n>=number[j])
		{
			j++;
		}
		n-=number[j--] ;//因为要用num减掉已经计算过的
		printf("2");
		if(j!=1) printf("(");
		if(j==0||j==2) printf("%d)",j);//注意还有一个) 
		if(j>=3) {
			dfs(j);
			printf(")");
		}
		if(n!=0)
		{
		  printf("+");
		  dfs(n);
		}
	}
}
int main()
{
	int num;//这里num不能用全局变量 
	scanf("%d",&num);
	number[0]=1;
	for(int i=1;i<=50;i++)
	{
		number[i]=number[i-1]*2;
	}
	dfs(num);
	return 0;
}

方法二:皮一下,打个表哈哈哈哈哈哈

/*
另外如果注意到数据范围n<=20000,而20000<2^15,所以可以用打表的方法,
列出幂分别为1~14时候的输出.
每次查找最大幂来输出。比如137,"幂7输出+幂3输出+幂0输出"就完了。*/
/*#include<cstdio>
#include<iostream>
using namespace std;
int main()
{
	int num=1;
	for(int i=1;i<=25;i++)
	{
		num*=2;
		printf("%d\n",num);
		if(num>=20000)
		{
		    
			printf("%d",i);
			break;
		}
		
	}
	return 0;
	
//发现输出为15,也就是到15就停了 
}*/ 
/*2
4
8
16
32
64
128
256
512
1024
2048
4096
8192
16384
32768*/

感觉一点也不好玩!!还是正解好看

            if(i==1) printf("2(0)"); 
			if(i==2) printf("2");
			if(i==3) printf("2(2)");
			if(i==4) printf("2(2+2(0)");
			if(i==5) printf("2(2(2))");
			if(i==6) printf("2(2(2)+2(0))");
			if(i==7) printf("2(2(2)+2)");
            if(i==8) printf("2(2(2)+2+2(0))");
            if(i==9) printf("2(2(2+2(0)))");
            if(i==10) printf("2(2(2+2(0))+2(0))");
            if(i==11) printf("2(2(2+2(0))+2)");
            if(i==12) printf("2(2(2+2(0))+2+2(0))");
            if(i==13) printf("2(2(2+2(0))+2(2))");
            if(i==14) printf("2(2(2+2(0))+2(2)+2(0))");
            if(i==15) printf("2(2(2+2(0))+2(2)+2)");
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值