4.2的次幂表示

发布时间 2023-08-02 09:29:04作者: 梦想是能睡八小时的猪

【题目】

题目描述:
       任何一个正整数都可以用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)

【思想】

递归,每次递归传入的值是2的次幂,用一个总值保存当前的结果,当总和小于的时候,递归当前2的次幂,递归边界条件是三个直接表示,即2的0次幂=1,2的1次幂=2,2的2次幂=4

当总和等于目标值,结束递归。

【代码】

import java.util.*;

public class Main{
    private static String coupons(int n){
        int sum=0;
        String res="";
        for(int i=15;i>=0;i--){
            int temp=(int)Math.pow(2,i);
            if(sum+temp<n){
                sum+=temp;
                String str="";
                if (i == 0) {
                    str = "2(0)";
                } else if (i == 1) {
                    str = "2";
                } else if (i == 2) {
                    str = "2(2)";
                }else{
                    str = "2("+coupons(i)+")";
                }
                result+=(str+"+");
            }else if(sum+temp==n){
                sum+=temp;
                String str="";
                if (i == 0) {
                    str = "2(0)";
                } else if (i == 1) {
                    str = "2";
                } else if (i == 2) {
                    str = "2(2)";
                }else{
                    str = "2("+coupons(i)+")";
                }
                res+=str;
                break;
            }
        }
        return res;
    }
    public static void main(String[] args){
        Scanner reader = new Scanner(System.in);
        int n = reader.nextInt();
        System.out.println(coupons(n));    
    }      
}