幂次方表达:p1010
1 题目ID:
P1010 [NOIP1998 普及组] 幂次方
2 题目描述:
任何一个正整数都可以用 22 的幂次方表示。例如 137=2^7+2^3+2^0137=27+23+20。
同时约定方次用括号来表示,即 a^bab 可表示为 a(b)a(b)。
由此可知,137137 可表示为 2(7)+2(3)+2(0)2(7)+2(3)+2(0)
进一步:7= 2^2+2+2^07=22+2+20 ( 2^121 用 22 表示),并且 3=2+2^03=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=2^{10} +2^8 +2^5 +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 表示(在表示中不能有空格)。
输入输出样例
1315
2(2(2+2(0))+2)+2(2(2+2(0)))+2(2(2)+2(0))+2+2(0)
说明/提示
【数据范围】
对于 100\%100% 的数据,1 \le n \le 2 \times {10}^41≤n≤2×104。
3 题目分析:
输入一个数字,必然能用 2 的n元次幂和表示(除了0),这是毫无疑问的。但是如何表达?
首先考虑到每一个数在计算机里都是按二进制存储的,如果将这个数右移一位,这个数就相当于除了2,同时最高位向右移了一位,其位置,相当于最大的2次幂数。
由此,我们可以得出一个解决方法,对输入的数进行移位,每移位依次,就输入对应的状态的符号,例如输入7,存储为 0000 1011。向右移位,得 0000 0101。输出”2(“,
再移位,得 0000 0010。输出 "2)",再移位,得 0000 0001。输出 "+2" ,再移位,得 0000 0000。输出 "+2(0)"。以上由递归完成。
3.1 数据结构描述:
已知输入为一位 int 的数据,则为其 二进制最高位 配置一个 int 类型的状态位。同时配置一个 string 类型变量,作为输出。
3.2 算法描述:
设置变量 (int) n,作为输入,设置递归函数 op(int x,int i = 0, string s = string("") ) 返回类型为string。x 作为主参数,决定输出内容。i 作为辅助参数,default为0,用来判断当前输出什么内容,s作为返回参数,default为""。
将n作为参数输入op(),进入函数后,首先判断参数 x 是否为0,若为0,则表明此时当前输入只能输出"2(0)"。
若不为1,判断是否为0,为0则返回无内容。若不为0,则进入循环,若 x 不为 0 ,则往 s 中填内容,若 i 为 1,则表示,此时函数已经递归过了,正在判断是否需要填充2。不为 1,则有两种可能,一是刚进入函数,二是已多次进入递归,之后将 i 作为参数传入函数op(),进行递归。按结果分别往s中填充内容。若 s 填充之前为空,则次数不需要填充"+",因为无内容填充"+",会导致 "(+2"或者"2+)"的情况出现。
递归返回string,输出函数返回值。
例如 7 (4 + 2 + 1),7 进入后先表达4,即 2(2)+,2表达为 +2,1表达为 2(0)。最终返回的就是 2(2) + 2 + 2(0)。
4 具体代码
#include<iostream>
using namespace std;
string op(int x,int i = 0,string s = string("")){
if(!x)return string("0");
do
if(x&1)
s = (i == 1 ? "2" : "2(" + op(i) + ")") +
(s == "" ? "":"+") +
s;
while(++i,x>>=1);
return s; }
int main(){
int n; cin>>n; cout<<op(n)<<endl; return 0;
}
幂次方表达:p1010的更多相关文章
- P1010 幂次方 P1022 计算器的改良
P1010 幂次方 一.题目 https://www.luogu.org/problemnew/show/P1010 二.代码 #include<bits/stdc++.h> using ...
- 2021.07.26 P1010 幂次方(数论)
2021.07.26 P1010 幂次方(数论) [P1010 NOIP1998 普及组] 幂次方 - 洛谷 | 计算机科学教育新生态 (luogu.com.cn) 重点: 1.二进制 题意: 用20 ...
- 洛谷 P1010 幂次方 Label:模拟
题目描述 任何一个正整数都可以用2的幂次方表示.例如 137=2^7+2^3+2^0 同时约定方次用括号来表示,即a^b 可表示为a(b). 由此可知,137可表示为: 2(7)+2(3)+2(0) ...
- 解题笔记-洛谷-P1010 幂次方
0 题面 题目描述 任何一个正整数都可以用2的幂次方表示.例如 137=2^7+2^3+2^0 同时约定方次用括号来表示,即a^b 可表示为a(b). 由此可知,137可表示为: 2(7)+2(3)+ ...
- P1010 幂次方 递归模拟
题目描述 任何一个正整数都可以用22的幂次方表示.例如 137=2^7+2^3+2^0137=27+23+20 同时约定方次用括号来表示,即a^bab 可表示为a(b)a(b). 由此可知,13713 ...
- p1010幂次方---(分治)
题目描述 任何一个正整数都可以用222的幂次方表示.例如 137=27+23+20137=2^7+2^3+2^0 137=27+23+20 同时约定方次用括号来表示,即aba^bab 可表示为a(b) ...
- 洛谷P1010 幂次方
题目描述 任何一个正整数都可以用2的幂次方表示.例如 137=2^7+2^3+2^0 同时约定方次用括号来表示,即a^b 可表示为a(b). 由此可知,137137可表示为: 2(7)+2(3)+2( ...
- LG1010 幂次方
题目描述 任何一个正整数都可以用2的幂次方表示.例如 137=2^7+2^3+2^0 同时约定方次用括号来表示,即a^b 可表示为a(b). 由此可知,137可表示为: 2(7)+2(3)+2(0) ...
- C++ 2的幂次方表示
[题目描述] 任何一个正整数都可以用2的幂次方表示.例如: 137=27+23+20 同时约定方次用括号来表示,即ab可表示为a(b).由此可知,137可表示为: 2(7)+2(3)+2(0) 进一步 ...
随机推荐
- 【java】学习路线8-cmd带命令编译包
/*java类包(package)package XX.XX.XX; 包名命名规则:(以域名开头,都是小写) com.remooo.xx 编译:javac -d . ...
- C++ 对于函数名的操作,函数名本身和取*以及取&的区别
void TestFunc() { } int _tmain(int argc, _TCHAR* argv[]) { cout<<TestFunc<<endl; cout< ...
- 简单创建一个SpringCloud2021.0.3项目(三)
目录 1. 项目说明 1. 版本 2. 用到组件 3. 功能 2. 上俩篇教程 3. Gateway集成sentinel,网关层做熔断降级 1. 超时熔断降级 2. 异常熔断 3. 集成sentine ...
- 通过Quartz 进行定时任务
小记一下通过Quartz 进行轮询数据库从而进行自动打印的需求. 一:首先通过NuGet引用Quartz,Quartz依赖Common.Logging和Common.Logging.Log4Net12 ...
- Mac_linux_ssh防掉线
vi ~/.ssh/config 加入一条 ServerAliveInterval 60 #客户端主动向服务端请求响应的间隔
- 命令行配置Windows高级防火墙
今天正好看到个帖子,询问如何通过命令行配置防火墙策略中远程IP的地址,特别是添加新的地址. 就是图中Scope里Remote IP address的地址. 第一反应就是用netsh firewall来 ...
- 关于kibana启动时有几个warning警告信息的解决办法
启动kibana时会有几个warning信息,具体如下: 针对xpack这几个相关的,在kibana.yml文件中新增如下三个配置即可: # 注意:参数值至少32位,否则启动会报错提示 xpack.e ...
- kvm里的虚拟机硬盘和网卡使用virtio驱动
1.首先从虚拟机的xml文件中找到已经使用virtio驱动的硬件,复制里面的address这行参数出来 <address type='pci' domain='0x0000' bus='0x00 ...
- windows系统下使用bat脚本文件设置MySQL系统环境变量
说明:在一个bat文件中设置tomcat环境变量后,不能直接使用,需要另起一个bat文件才能使用 号开头的行不要写在bat文件中 # 这个bat文件实现的功能:设置环境变量 @echo off set ...
- SpringBoot项目的CI配置 # 安全变量
运行GitLab Runner容器 参考Run GitLab Runner in a container - Docker image installation and configuration 执 ...