版权声明:小媛原创,转载请注明出处! 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)");