蓝桥杯-2的次幂表示(java)

来源:互联网 发布:科比2010总决赛数据 编辑:程序博客网 时间:2024/05/21 06:45
                         算法训练 2的次幂表示                      时间限制:1.0s   内存限制:512.0MB        问题描述          任何一个正整数都可以用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)        提示          用递归实现会比较简单,可以一边递归一边输出
    package com.sihai.advance;    import java.util.*;        import java.math.*;      /*      * 1、先把一个整数变成二进制字符串,确定二进制1的个数N,然后按照二进制幂指数按照特定格式输出,      * 2、使用二进制字符串的从左到右数的第一个1      * 3、如果幂指数k为0或者2,输出2(k),      * 4、如果幂指数为1输出2      * 5、如果幂指数大于2,输出2(,然后调用自身传递k,最后输出)      * 6、如果1的用的次数小于N,输出+,否则不输出      */      public class Main{          private static int find_one(String str_bin_val)          {              int count=0;              for(int k=0;k<str_bin_val.length();k++)              {                  if(str_bin_val.charAt(k)=='1')                      count++;              }              return count;          }          private static void bin_print(int a)          {              String str_bin=Integer.toBinaryString(a);              int one_count=0;              int one_sum=find_one(str_bin);              int len=str_bin.length();              int k=len-1;              for(int i=0;i<len;i++)              {                  if(str_bin.charAt(i)=='1')                  {                      if(k==0||k==2)                      {                          System.out.print("2(");                          System.out.print(k);                          System.out.print(")");                      }                      else if (k==1)                      {                          System.out.print("2");                      }                      else                      {                          System.out.print("2(");                          bin_print(k);//递归调用                          System.out.print(")");                      }                      one_count++;                      if(one_count<one_sum)//最后的不应该输出+号的                          System.out.print("+");                  }                  k--;              }          }          public static void main(String[] args)          {              Scanner sc=new Scanner(System.in);              int src=sc.nextInt();              bin_print(src);          }      }  
0 0