洛谷刷题C++语言 | P1010 幂次方

学习C++从娃娃抓起!记录下洛谷C++学习和备考过程中的题目,记录每一个瞬间。

附上汇总贴:洛谷刷题C++语言 | 汇总_热爱编程的通信人的博客-CSDN博客


【题目描述】

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

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

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

进一步:

7=2^2+2+2^0 ( 2^1 用 2 表示),并且 3=2+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)。

【输入】

一行一个正整数 n

【输出】

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

【输入样例】

1315

【输出样例】

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

【代码详解】

#include <bits/stdc++.h>
using namespace std;
int mark[20] = {1};
void f(int n) 
{
    int flag = 0;
    while (n>=mark[flag]) {
        flag++;
    }
    flag--;
    if (flag==1) {
        cout << 2;
    } else {
        if (flag==0) {
            cout << "2(0)";
        } else {
            cout << "2(";
            f(flag);
            cout << ")";
        }
    }
    n -= mark[flag];
    if (n!=0) {
        cout << "+";
        f(n); 
    }

}
int main()
{
    int n; 
    cin >> n;
    for (int i=1; i<17; i++) mark[i] = mark[i-1] * 2;
    f(n);
    return 0;
}

【运行结果】

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

猜你喜欢

转载自blog.csdn.net/guolianggsta/article/details/134004867