您的位置:首页 > 其它

2的次幂表示 蓝桥杯

2016-02-13 12:14 267 查看
问题描述   任何一个正整数都可以用2进制表示,

例如:137的2进制表示为10001001。

  将这种2进制表示写成2的次幂的和的形式,令次幂高的排在前面,可得到如下表达式:137=2^7+2^3+2^0
  现在约定幂次用括号来表示,即a^b表示为a(b)
  此时,137可表示为:2(7)+2(3)+2(0)
  进一步:7=2^2+2+2^0 (2^1用2表示)
  3=2+2^0 
  所以最后137可表示为:2(2(2)+2+2(0))+2(2+2(0))+2(0)
  又如:1315=2^10+2^8+2^5+2+1
  所以1315最后可表示为:
  2(2(2+2(0))+2)+2(2(2+2(0)))+2(2(2)+2(0))+2+2(0) 

输入格式:

正整数(1<=n<=20000)

 输出格式:  

 符合约定的n的0,2表示(在表示中不能有空格) 

样例输入 137 

样例输出 2(2(2)+2+2(0))+2(2+2(0))+2(0) 

样例输入 1315 

样例输出 2(2(2+2(0))+2)+2(2(2+2(0)))+2(2(2)+2(0))+2+2(0)

提示
用递归实现会比较简单,可以一边递归一边输出 解题思路 用递归来实现。将十进制数转换成二进制,记录转换过程中为1的是第几次循环,然后再判断。递归的边界就是当n==0,n==1n==2的时候。 但是应该注意的是,要判断什么时候输出+号,什么时候不输出。当不是最后一个的时候就输出 + 定义数组的时候要定义为局部变量,因为每一次数组存储的都不同。 代码

?
***************************************************************************************

#include <stdio.h>  

  

void fun(short i)  

{  

    int j=0;  

    if(i==0)  

    {     

        printf("0");  //0位是1时,配合调用前的2()正好组成2(0),即1  

        return;  

    }  

    if (i==1)  

    {         

  

        printf("2(0)"); //1位是0,即2(2(0)),也就是2,只有2(),括号内的数拆分时有1才会用到  

        return;  

    }  

    if(i==2)  

    {  

        printf("2");  //2(2)  

        return;  

    }  

      

    for(;i!=0;j++)  

    {  

        if(i&1)   //位运算  

        {  

            if(j==1)  //2位为1直接打印2,不再递归  

                printf("2");  

            else  

            {  

                printf("2(");  

                fun(j);   

                printf(")");          

            }  

            i=i>>1;  

            if(i!=0)  

                printf("+"); //看情况打印“+”号  

            continue;  

              

        }  

        i=i>>1;  

    }  

}  

  

  

int main(int argc, char* argv[])  

{  

    short i;  

    scanf("%d",&i);  

    fun(i);  

    return 0;  

}  
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息