算法训练 2的次幂表示 :http://lx.lanqiao.org/problem.page?gpid=T235
应该算是比较经典的递归了,直接调用递归函数即可,比较有意思
具体思路,将数变为二进制字符串,遍历每一位的字符,若为1则递归输出其位数,由于输出中只有2、2(0)、2(2)以及更高次幂四种情况,因此分四种即可
#include <stdlib.h>
#include <stdio.h>
#include <math.h>
#include <cstring>
#include <algorithm>
#include <iostream>
using namespace std;
void fun(int bit){
char s[20];
if(bit>2){
itoa(bit, s, 2); //转换成字符串,进制基数为2,i转化为 注意是整型和字符数组之间的转化
int len = strlen(s);
int mark=0; //标记是否输出+号,因为开始的时候是没有加号的
for(int i=0;i<len;i++){
if(s[i]!='0'){
if(mark==1)
cout<<'+';
cout<<2;
if(len-i-1!=1) //控制()是否输出,如果等于1的话就不输出,因为2的1次方直接输出2就可以了
cout<<'(';
fun(len-i-1);
mark=1;
if(len-i-1!=1)
cout<<')';
}
}
return ;
}
if(bit==2){
cout<<"2";
return ;
}
if(bit==1){
cout<<"";
return ;
}
if(bit==0){
cout<<"0";
return ;
}
}
int main()
{
int n;
cin>>n;
fun(n);
return 0;
}
下面代码稍微长一点,但是好像理解起来简单点
#include <stdlib.h>
#include <stdio.h>
#include <math.h>
#include <cstring>
#include <algorithm>
#include <iostream>
using namespace std;
void fun(int bit){
char s[20];
if(bit>7){
itoa(bit, s, 2); //转换成字符串,进制基数为2,i转化为 注意是整型和字符数组之间的转化
int len = strlen(s);
int mark=0; //标记是否输出+号,因为开始的时候是没有加号的
for(int i=0;i<len;i++){
if(s[i]!='0'){
if(mark==1)
cout<<'+';
cout<<2;
if(len-i-1!=1)
cout<<'(';
fun(len-i-1);
mark=1;
if(len-i-1!=1)
cout<<')';
}
}
return ;
}
if(bit==7){
cout<<"2(2)+2+2(0)";
return ;
}
if(bit==6){
cout<<"2(2)+2";
return ;
}
if(bit==5){
cout<<"2(2)+2(0)";
return ;
}
if(bit==4){
cout<<"2(2)";
return ;
}
if(bit==3){
cout<<"2+2(0)";
return ;
}
if(bit==2){
cout<<"2";
return ;
}
if(bit==1){
cout<<"";
return ;
}
if(bit==0){
cout<<"0";
return ;
}
}
int main()
{
int n;
cin>>n;
fun(n);
return 0;
}