列表

详情


NC16781. [NOIP1998]幂次方

描述

任何一个正整数都可以用2的幂次方表示。例如:                  
137=27+23+20         
同时约定方次用括号来表示,即ab可表示为a(b)。
由此可知,137可表示为:
2(7)+2(3)+2(0)
进一步:7=22+2+20(21用2表示)
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 ≤ 20000)

输出描述

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

示例1

输入:

1315

输出:

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

原站题解

上次编辑到这里,代码来自缓存 点击恢复默认模板

Python3 解法, 执行用时: 43ms, 内存消耗: 4552K, 提交时间: 2023-05-07 21:20:05

n = int(input())

def res(n):
    if n == 1:
        return "2(0)"
    elif n == 2:
        return "2"
    elif n == 3:
        return "2+2(0)"
    len_ = len(bin(n)) - 3
    s = n - 2 ** len_
    if s > 0:
        return f"2({res(len_)})+{res(s)}"
    else:
        return f"2({res(len_)})"
print(res(n))

C++14(g++5.4) 解法, 执行用时: 5ms, 内存消耗: 496K, 提交时间: 2020-04-15 20:44:15

#include<iostream>
using namespace std;
int x;
string run(int x,int i=0,string s=string("")){
    if(x==0)return string("0");
    do if(x&1)s=(i==1?"2":"2("+run(i)+")")+(s==""?"":"+")+s;
    while(++i,x>>=1);
    return s;
}
int main(){
    cin>>x;
    cout<<run(x)<<endl;
}

C++11(clang++ 3.9) 解法, 执行用时: 5ms, 内存消耗: 376K, 提交时间: 2019-07-30 08:50:44

#include<bits/stdc++.h>
using namespace std;
string run(int x,int i=0,string s=string(""))
{
	if(x==0)return string("0");
	do if(x&1)s=(i==1?"2":"2("+run(i)+")")+(s==""?"":"+")+s;
	while(++i,x>>=1);
	return s;
}
int main()
{
	int x;
	cin>>x;
	cout<<run(x)<<endl;
}

上一题