P1010 [NOIP1998 普及组] 幂次方

题目描述

任何一个正整数都可以用 22 的幂次方表示。例如 137=27+23+20137=27+23+20。

同时约定次方用括号来表示,即 abab 可表示为 a(b)a(b)。

由此可知,137137 可表示为 2(7)+2(3)+2(0)2(7)+2(3)+2(0)

进一步:

7=22+2+207=22+2+20 ( 2121 用 22 表示),并且 3=2+203=2+20。

所以最后 137137 可表示为 2(2(2)+2+2(0))+2(2+2(0))+2(0)2(2(2)+2+2(0))+2(2+2(0))+2(0)。

又如 1315=210+28+25+2+11315=210+28+25+2+1

所以 13151315 最后可表示为 2(2(2+2(0))+2)+2(2(2+2(0)))+2(2(2)+2(0))+2+2(0)2(2(2+2(0))+2)+2(2(2+2(0)))+2(2(2)+2(0))+2+2(0)。

输入格式

一行一个正整数 nn。

输出格式

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

输入输出样例

输入 #1复制

1315

输出 #1复制

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

说明/提示

【数据范围】

对于 100%100% 的数据,1≤n≤2×1041≤n≤2×104。

NOIP1998 普及组 第三题

思路

这道题可以通过递归来解决。

我们首先定义一个递归函数 solve(n),表示将正整数 n 用 2 的幂次方表示。

在递归函数中,我们首先处理递归终止条件,即当 n 等于 0 或者 1 时,直接返回对应的字符串。

然后,我们通过循环从 0 开始尝试不同的幂次方,即从 2^0 到 2^k,其中 k 是满足 2^k ≤ n 的最大整数。

对于每个幂次方 i,我们递归调用 solve(n - 2^i),得到一个表示 n - 2^i 的字符串。

接下来,我们将这个字符串与 2^i 拼接起来,并用括号括起来,即得到一个表示 n 的字符串。

最后,我们将所有的字符串拼接起来,以加号分隔,即得到最终的结果。

代码

点个赞再给个关注吧

#include <iostream>
#include <string>
using namespace std;

string solve(int n) {
    if (n == 0) {
        return "0";
    }
    if (n == 1) {
        return "2(0)";
    }
    string result = "";
    int i = 0;
    while ((1<<i) <= n) {
        if ((n & (1<<i)) != 0) {
            if (result != "") {
                result += "+";
            }
            if (i == 1) {
                result += "2";
            } else {
                result += "2(" + solve(i) + ")";
            }
        }
        i++;
    }
    return result;
}

int main() {
    int n;
    cin >> n;
    string result = solve(n);
    cout << result << endl;
    return 0;
}
 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值