前言
以后文章名字就按照题目名字来发了吧。
先给出题目来源:P1010 [NOIP1998 普及组] 幂次方
题目解答:
其实这道题看起来复杂,但是实际上只是一道简单的递归题。具体的做法时,每次对n进行结果搜索时,先找到一个最接近n的
2
k
2^k
2k对应的k,然后判断一下,当这个k不为0或者1的时候,则要对k进行递归查找,因此要先输出一个"2(“然后递归搜索k然后输出一个”)";当k为0或者1的时候,可以直接输出"2"或者"2(0)",然后用n减去
2
k
2^k
2k得到一个余数n’.当余数不为0的时候,说明本次搜索n还没结束,因此线输出一个"+"然后用n减去
2
k
2^k
2k,在其中继续搜索就可以了。
如此递归搜索,直到满足n-
2
k
2^k
2k为0即可退出。给出我的AC代码:
#include <stdio.h>
#include <stdlib.h>
int find(int a){
int i,temp;
for(i=0;i<=20;i++){
if(i==0){
temp=1;
if(temp*2>a)
break;
}else{
temp*=2;
if(temp*2>a)
break;
}
}
return i;
}
int power(int a,int b){
int ans=1,i;
for(i=1;i<=b;i++)
ans*=a;
return ans;
}
void search(int n){
int a,temp;
while(n!=0){
a=find(n);
if(a==1){
printf("2");
}
else if(a==0){
printf("2(0)");
}
else{
printf("2(");
search(a);
printf(")");
}
if(n-power(2,a)!=0){
printf("+");
n-=power(2,a);
}else{
break;
}
}
return;
}
int main(int argc, char *argv[]){
int n;
scanf("%d",&n);
search(n);
return 0;
}