Skip to content

08758: 2的幂次方表示

http://cs101.openjudge.cn/practice/08758/

任何一个正整数都可以用2的幂次方表示。例如:

137=27+23+20

同时约定方次用括号来表示,即ab可表示为a(b)。由此可知,137可表示为:

2(7)+2(3)+2(0)

进一步:7=22+2+20212

​ 3=2+20

所以最后137可表示为:

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

又如:

1315=210+28+25+2+1

所以1315最后可表示为:

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

输入

一个正整数n(n≤20000)。

输出

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

样例输入

137

样例输出

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

来源:NOIP1998复赛 普及组 第一题

编写一个函数,该函数接受一个整数n作为输入,并返回它的2的幂次方表示。我们将遵循以下步骤:

  1. 首先,我们需要找到表示该数字所需的最大2的幂次方,即找到满足2^x <= n的最大的x
  2. 然后,我们递归地应用相同的过程来表示余数n - 2^x
  3. 在每一步中,我们将幂次也表示为2的幂次方。

基于上述思路,以下是Python代码:

python
def power_of_two_representation(n):
    # 函数用于找到小于或等于n的最大2的幂次
    def find_max_power(n):
        power = 0
        while (1 << power) <= n:
            power += 1
        return power - 1

    # 函数用于将幂次表示为2的幂次方的表示
    def represent_power(power):
        if power == 1:
            return '2'
        elif power == 0:
            return '2(0)'
        else:
            return '2(' + power_of_two_representation(power) + ')'

    # 特殊情况:如果n是0,直接返回空字符串
    if n == 0:
        return ''

    result = ''
    while n > 0:
        max_power = find_max_power(n)
        # 如果结果字符串不为空,添加加号
        if result:
            result += '+'
        # 把最大幂次转换为2的幂次方的表示
        result += represent_power(max_power)
        # 减去已经表示的数,继续寻找余数的表示
        n -= 1 << max_power

    return result

print(power_of_two_representation(int(input())))

当你运行这个代码时,它将打印出题目所要求的137的2的幂次方表示。这段代码定义了两个辅助函数find_max_powerrepresent_power来递归地构建答案。主要的逻辑在power_of_two_representation函数中,它使用了位运算符<<来快速计算2的幂,并用字符串拼接来构建2的幂次方表示。