算法训练 2的次幂表示 ——蓝桥杯

问题描述
  任何一个正整数都可以用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 #include<stdio.h> 
 2 int a[15]={1,2,4,8,16,32,64,128,256,516,1024,2048,4096,8192,16384};//用来判断n的大小 
 3 int main()
 4 {
 5     void fun(int n);
 6     int m;
 7     scanf("%d",&m);
 8     fun(m);
 9     return 0;
10  }
11  void fun(int n)
12  {
13      int i;
14      if(n==0) {printf("0");return;}  
15      if(n==1) {printf("2(0)");return;}
16      if(n==2) {printf("2");return ;}
17      for(i=14;i>=0;i--)//循环判断输出 
18      {
19          if(n>=a[i])
20          {
21              n-=a[i];//新的n的值 
22              if(i==1)
23              {
24               printf("2");
25              }
26              
27              else
28              {
29              printf("2(");
30 
31              fun(i);
32              printf(")");
33              }
34              if(n!=0)  
35             printf("+");    
36         }    
37     }         
38   } 

 

posted @ 2017-02-02 20:27  余小叙  阅读(270)  评论(0编辑  收藏  举报