算法训练 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; }