6Luffy6

导航

< 2025年3月 >
23 24 25 26 27 28 1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 29
30 31 1 2 3 4 5

统计

P1010 [NOIP1998 普及组] 幂次方

传送锚点:https://www.luogu.com.cn/problem/P1010

题目描述

任何一个正整数都可以用 2 的幂次方表示。例如 $137=27+23+2^0 $。

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

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

进一步:

7=22+2+20 ( 212 表示),并且 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

输出格式

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

样例 #1

样例输入 #1

1315

样例输出 #1

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

提示

【数据范围】

对于 100% 的数据,1n2×104

NOIP1998 普及组 第三题

思路

此题要将数字n转换为二进制表达,所以先求出n的二进制位数,在从b的二进制最高位开始遍历,如果遍历到倒数第2位,输出2,遍历到最后一位,输出2(0),否则继续递归(前提是该位为1)

code

#include <iostream>
using namespace std;

typedef long long ll;
void solve(int n){
        int temp = n, sum = 0;//sum记录n的二进制位数
        while(temp){
            temp >>= 1;
            sum++;
        }
        bool flag = true;//true代表是第一个数字
        for(int i = sum - 1; i >= 0; i--){
            if((n >> i) & 1){//n的第i位是1
                if(flag) flag = false;
                else cout << "+";
                if(i == 1) cout << "2";//避免如3时 出现2(2(0) + 2(0)的情况
                else if(i == 0) cout << "2(0)";
                else cout << "2(", solve(i), cout << ")";
            }
        }
}

int main() {
   int n;
   cin >> n;
   solve(n);
}

posted on   极客三刀流  阅读(77)  评论(0编辑  收藏  举报

相关博文:
阅读排行:
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 单元测试从入门到精通
· 上周热点回顾(3.3-3.9)
· Vue3状态管理终极指南:Pinia保姆级教程
点击右上角即可分享
微信分享提示