题目:
这道题其实就是一个简单的进制转换问题,分析一下可能出现的各种情况即可这里需要注意的就是数字2输出的就是2,而很多算法可能会输出2(2(0))也就是2^1,处理细节到1,2还有3即可,直接上代码:
#include<stdio.h>
#include<math.h>
void search(int x)//简单的递归
{
int i=0,m;
if(x==1){//分析0,1,3可能会出现的情况
printf("2(0)");
}else if(x==2){
printf("2");
}else if(x==3){//这里判定三其实可以删除掉,不过这样判定就少了一次筛选过程
search(2);
printf("+");
search(1);
}else{
printf("2(");
while(x>=pow(2,i)){
i++;
}
i--;
if(x==pow(2,i)){
search(i);
printf(")");//每一个式子都要记住反括号
}else {
search(i);
printf(")+");//输出加号
search(x-pow(2,i));
}
}
}
int main()
{
int n;
scanf("%d",&n);
search(n);
return 0;
}
高中就写过一遍,那时候算法好像不是这样的,就翻了一下书,结果想到位运算会简单很多,不过下面的代码是一位大佬写的(加了一些注释,大佬确实厉害),用到c++的string类型,要不然会更麻烦一点:
#include<bits/stdc++.h>
using namespace std;
string run(int x,int i=0,string s=string("")){
if(x==0)return string("0");
do if(x&1)s=(i==1?"2":"2("+run(i)+")")+(s==""?"":"+")+s;
//拼接字符串,应题意,要把低次方接在后面
//三位运算符简化操作
while(++i,x=x>>1);//移位操作
return s;
}
int main(){
int x;cin>>x;
cout<<run(x)<<endl;
}