2的幂次方表示题解
芬贝多:
因为2进制正是计算机储存数据的方法,所以个人认为这一题用位运算能够更方便地解决此问题。
[code=cpp]
#include
#include
using namespace std;
void f(int n)
{
if(n==0)//结束递归,避免出现 0=2(2(2(…
printf("0");
else
{
int i=0;
while(n >> i+1)//用于计算满足 n >= 2(i) 的i的最大值
++i;
if(i==1)//避免出现 2=2(2(0))
printf("2");
else
{
printf("2(");
f(i);//继续分解打印 n=2(i)… 中的 'i'
printf(")");
}
if(n & n-1)//用于判断是否要进行'+'运算
/*
较难理解,以5和16为例:
101 1000
&100 & 111
100 0000
可以看出 n & n-1 用于去除数二进制表示中位数最低的'1'
一旦 n & n-1 为真,则表示 n 二进制表示中'1'至少有两个
则有 n > 2(i) 如 5(B101) > 4(B100),16(B1000) == 16(B1000)
则要进行'+'运算,反之亦然
*/
{
printf("+");
f(n ^= (1 |