【P1010 [NOIP1998 普及组] 幂次方】

[NOIP1998 普及组] 幂次方

问题描述

给定一个正整数 n n n,我们希望找到一种方式,将它表示为 2 2 2 的幂次方的和。例如,对于 137 137 137,可以表示为 2 7 + 2 3 + 2 0 2^7+2^3+2^0 27+23+20,或者按照约定的方式 2 ( 7 ) + 2 ( 3 ) + 2 ( 0 ) 2(7)+2(3)+2(0) 2(7)+2(3)+2(0)

用括号来表示幂次方,即 a b a^b ab 可以表示为 a ( b ) a(b) a(b)。例如, 7 7 7 可以表示为 2 2 + 2 + 2 0 2^2+2+2^0 22+2+20,其中 2 1 2^1 21 2 2 2 表示,这可以写成 2 ( 2 + 2 ( 0 ) ) + 2 2(2+2(0))+2 2(2+2(0))+2

解决方法

使用递归的方式来解决这个问题。首先找到最大的 2 k 2^k 2k,其中 k k k 是满足 2 k ≤ n 2^k \leq n 2kn 的最大整数。然后将 n n n 表示为 2 k 2^k 2k 和一个小于 2 k 2^k 2k 的余数的和。这个过程可以递归进行,直到余数为 0 0 0

#include<iostream>
using namespace std;

void search(int n) {
    if (n != 0) {
        int i = 1, q = 0;
        while (i <= n) {
            i *= 2;
            q++;
        }
        q--;
        i /= 2;
        if (q == 0 || q == 2)
            cout << "2(" << q << ")";
        else if (q == 1)
            cout << "2";
        else {
            cout << "2(";
            search(q);
            cout << ")";
        }
        n -= i;
        if (n != 0) {
            cout << "+";
            search(n);
        }
    }
}

int main() {
    int n;
    cin >> n;
    search(n);
    return 0;
}

输入与输出

输入是一个正整数 n n n,表示我们要表示的数。

输出是满足约定的 n n n 的表示,其中没有空格。

示例

输入示例

1315

输出示例

2(2(2+2(0))+2)+2(2(2+2(0)))+2(2(2)+2(0))+2+2(0)
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

武帝为此

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值