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

版权声明:小媛原创,转载请注明出处! https://blog.csdn.net/xingfushiniziji/article/details/84337582

洛谷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)");

猜你喜欢

转载自blog.csdn.net/xingfushiniziji/article/details/84337582