NOIP 1998 普及组 复赛 幂次方
//1208 2的幂次方表示
//此文代码与本人极其相似,唯一不同就是此文代码成功了,http://www.cnblogs.com/bofengyu/p/4477355.html
//思路,先打印2(7)+2(3)+2(0)
//再对7 3 0进行处理,本人这里没静下心,怎么编也编不出,参考了上述代码,发现离成功只有一步
//不过,相比 洛谷 P1010 幂次方 http://blog.csdn.net/mrcrack/article/details/61625530
//已经有了长足的进步
//该题是边编写边调试的典范。2017-11-7 18:51
//抽空,还是要独立再进行编写一次。
#include <stdio.h>
void f(int n,int step){
if(n==0)return;
f(n/2,step+1);
if(n%2==1){
if(n/2!=0){
printf("+");
}
if(step==1)printf("2");//此处添加
else{
printf("2(");
if(step==0)printf("0");
else f(step,0);
printf(")");
}
}
}
int main(){
int n;
scanf("%d",&n);
f(n,0);
return 0;
}
//P1010 幂次方
//快速幂的学习还是有帮助的,至少能分离出幂次方
//因n<=20000故n<2^15故数组不会太大
//采用递归,程序核心数据计算没有问题,但打印又遇到困难,感觉有难度。
//硬着头皮,还是编好,样例测试通过,提交AC。
//收获,首次主动采用递归函数进行编程。难得。
#include <stdio.h>
#include <string.h>
void dy(int n){
int a[20],i,k=0;
memset(a,0,sizeof(a));
while(n){
if(n&1)
a[k]=1;
n>>=1;
k++;
}
if(k-1==0)
printf("2(0)");
else if(k-1==1)
printf("2");
else if(k-1==2)
printf("2(2)");
else{
printf("2(");
dy(k-1);
printf(")");
}
for(i=k-2;i>=0;i--)
if(a[i]==1){
if(i==0)
printf("+2(0)");
else if(i==1)
printf("+2");
else if(i==2)
printf("+2(2)");
else{
printf("+2(");
dy(i);
printf(")");
}
}
}
int main(){
int n;
scanf("%d",&n);
dy(n);
return 0;
}