P1010 幂次方
输入格式
一个正整数n(n≤20000)n(n≤20000)。
输出格式
符合约定的nn的0,20,2表示(在表示中不能有空格)
输入输出样例
输入
1315
输出
2(2(2+2(0))+2)+2(2(2+2(0)))+2(2(2)+2(0))+2+2(0)
好不容易写出来,看了题解这么容易。。。要不是看着这题好玩(等着天黑去跑步 )我就要第二天再做了。
我的没啥多说的,函数里面分了两类。。。看着都麻烦,还好勉强写出来了。
第二种是别人的,看着太好了,就自己写了一遍,可以直接用pow函数写着简便一些,不过我感觉这样快一些。。。强迫症犯了。还有用二进制的更简洁,emmmm看读懂
#include<stdio.h>
#include<math.h>
int sum=1,n,dx[10000]={1};
void solve(int x){
int t=x;
if(x==1) printf("2(0)");
else if(x==2) printf("2");
else{
int i,flag=0;
for(i=1;i<=sum;i++){
if(dx[i]>=x) break;
}
int s=i;
if((x > 0) && ((x & (x - 1)) == 0)){//判断一个数是不是2的n次方
//如8 -> 100&011 = 0
printf("2(");
for(i=s;i>=0;i--){
if(x>=dx[i]){
if(flag) printf("+");
x-=dx[i];
solve(i);
flag=1;
}
if(x==0) break;
}
printf(")");
}
else {
for(i=s;i>=0;i--){
if(x>=dx[i]){
if(flag) printf("+");
x-=dx[i];
solve(dx[i]);
flag=1;
}
if(x==0) break;
}
}
}
}
int main()
{
int i,j,flag=0;
scanf("%d",&n);
for(i=1;i<=n;i++){
sum*=2;
dx[i]=sum;
if(sum>n) break;
}
sum=i;
solve(n);
return 0;
}
#include<stdio.h>
#include<math.h>
int sum=1,n,dx[10000]={1};
void solve(int x){
int i,j;
for(i=sum;i>=0&&x!=0;i--){
if(x>=dx[i]){
if(i==1)printf("2");
else if(i==0) {printf("2(0)");
else {
printf("2(");
solve(i);
printf(")");
}
x-=dx[i];
if(x!=0) printf("+");
}
}
}
int main()
{
int i,j,flag=0;
scanf("%d",&n);
for(i=1;i<=n;i++){
sum*=2;
dx[i]=sum;
if(sum>n) break;
}
sum=i;
solve(n);
return 0;
}