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的偶次幂可以输出,奇次幂不能
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类型最大值为2的31次方,所以count为31
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);
}