2的幂次方,不知道哪里错了(递归)


void f(int n){
    if(n==0)return;
    if(n==1){
        cout<<"2(0)";
        return;
    }
    if(n>1&&n%2!=0){
        f(n-1);
        cout<<"+2(0)";
    }
    int i=2,j=1;
    while(n%i==0){
        i*=2;
        j++;
    }
    i/=2;
    j--;
    n-=i;
    
    if(n){//未被2整除 
        cout<<"2(";
        f(j);
        cout<<")+";
        f(n);
    }
    else{//n被2整除 
        cout<<"2(";
        f(j);
        cout<<")";
        return;
    }
    
}

2的偶次幂可以输出,奇次幂不能

img

https://blog.csdn.net/qq_54121864/article/details/118604228


#include<stdio.h>
int try(int n,int r);
int main()
{
    int n;
    scanf("%d",&n);
    if(n>=1){
        try(n,0);
    }
    else
        printf("Data Error!!!\n");
    return 0;
}
int try(int n,int r){
    if(n==1){
        printf("2(%d)",r);
    }
    else{
        try(n/2,r+1);
        if(n%2==1){
            printf("+2(%d)",r);
        }
    }
}

可以看看这种写法。


//n:为计算值    count:int类型最大值为231次方,所以count31
void f2(int n, int count = 31)
{
    //结束条件,计算值为0
    if(n<=0)
    {
        return;
    }

    //从最大的31次方开始比较,若剩余n值大,则输出并相减
    if(n >= std::pow(2, count))
    {
        n -= std::pow(2, count);
        std::cout<<"2("<<count<<")";

        //在n>0时才输出‘+’,保证最后末尾不会有‘+’
        if(n>0)
        {
            std::cout<<"+";
        }
    }

    //下一次计算
    f2(n, --count);
}

这道题其实很简单,只要把需要十进制数转成二进制数,再事先预处理一下2的i次幂,按照二进制数每一位所代表的数输出就行了

第八行到第十一行去掉,第十三行改为n>=i

没仔细看,但8-10行是不是存在问题?
if(n>1&&n%2!=0){
f(n-1);
cout<<"+2(0)";
}
你的想法是当k为奇数时2^k==2^(k-1)+1,显然这两者是不等的。
我以前也做过这种题,可以参考一下这份代码:
https://www.luogu.com.cn/record/43851842

建议把思路屡清楚,这段代码看下来,逻辑错误是没跑的了。递归算法一般是这样的:

f(n){
n=n-1;
if(n==0)return(0);
else f(n-1);
}