4.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)

进一步,对于括号里面的数字 73

  • 7 = 2^ 2+ 2 + 2^ 0 (2^1用2表示),即 7 = 2(2)+ 2 + 2(0)
  • 3 = 2 + 2^0,即 3 = 2 + 2(0)

代入 2(7)+2(3)+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表示(在表示中不能有空格)

样例输入1

 137

样例输出1

2(2(2)+2+2(0))+2(2+2(0))+2(0)

样例输入2

1315

样例输出2

2(2(2+2(0))+2)+2(2(2+2(0)))+2(2(2)+2(0))+2+2(0)

思路(目标正整数是n)

1.先找到小于等于n的 最大2的次幂 ,因为题干限定正整数的范围是0~20000,所以最多也就是 2^14 = 16384,也就是 2^i,i 最多找到14,绝对不可能到15。【直接写个for循环去找,但是这只是外层循环】。

(比如137的话,就是先去找128,也就是2^7)

2.当我们找到了 第一个 小于等于 n 的最大2次幂(2^i)之后,要去判断一下:是不是符合循环终止条件,这里包含两个问题,一个是:n 是否被分解完,另一个是 i 是否为 0 或者 1 或者 2。

n是否被分解完 —— 意味着外层循环能否停止,即能否输出结果

i 是否为 0 或者 1 或者 2 —— 意味着加号的 每个加式 是否符合 题意

显然,每个加号的加式的循环终止条件是 :i = 0 或者 1 或者 2

3.先来看外层循环,因为我们要去判断一下 n 有没有被分解完,所以要有一个 sum 来看我们目前已经 分出多少了,还要有一个 temp = 2 ^ i,来看目前的 i 的次幂是多少。

外层循环的判断条件:sum + temp < n

4.再看内层循环,如果满足 sum + temp < n 的话,那么我们对n的分解没结束,证明我们 还在分解其中某一个加式,再判断一下 i ,并且这里不能写break。

  • if i = 0 ,字符串要拼接一个 2(0)
  • if i = 1 ,字符串要拼接一个 2
  • if i = 2 ,字符串要拼接一个 2(2)
  • if 以上情况都不满足,即要再进行内层循环,即再次调用自己,再重复上述过程。

如果在循环满足 sum + temp == n 的话,证明我们对n的分解结束,表示 n 可以完全由幂次为 i 的 2 组成。将最后一个字符串添加到 res 中并跳出循环。

4.2的幂次方表示_第1张图片

注意这个地方的区别

代码

import java.util.*;
// 2的幂次方表示
public class test2 {
    public static  String coupons(int n){
        String res = "";
        int sum = 0;
        for (int i = 15; i >= 0; i--){
            // 用temp计算当前的2^i等于多少
            int temp = (int) Math.pow(2, i);

            if(sum + temp < n){
                sum = 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 = res +str+"+";
            } else if (sum + temp == n){
                sum = sum + temp;
                String str1 = "";
                if (i == 0){
                    str1 = "2(0)";
                } else if (i == 1){
                    str1 = "2";
                } else if (i == 2){
                    str1 = "2(2)";
                } else {
                    str1="2("+coupons(i)+")";
                }
                res = res + str1;
                break;

            }

        }

        return res;

    }


    // APPEND BEGIN
    public static void main(String[] args){
        Scanner reader = new Scanner(System.in);
        int n = reader.nextInt();
        System.out.println(coupons(n));

    }
}

你可能感兴趣的:(刷题,java,开发语言)