NOI-OJ 2.2 ID:8758 2的幂次方表示
思路
- 可以把任意一个数转化为2a+2b+2c+...+2n
- 例如137的二进制为10001001,这就等效于27+23+2^0
- 以上结果如何通过程序循环处理呢?需要把数字n分解为上述公式,对指数(a,b,...n)依次进行递归
- 要对整个结果进行递归生成字符串组后一次性输出比较麻烦,但若是递归输出就会很简单。
算法流程
- 将数字n的幂次方组合信息计算出来,存放在数组中
- 输出每一个加数项的底数和空格,指数通过递归方式输出
cout<<"2(";
mici(p);
cout<<")";
第1步的处理方法有多种,可以使用数组,也可以使用按位运算,详见例程
例程1
#include<iostream>
using namespace std;
void power(int n){
int i;
int plusFlag=1;
for(i=15; i>=0; i--){
if(n&(1<<i)){ //按位运算
if(plusFlag==1) plusFlag=0; //只有一次不输出“+”
else printf("+");
if(i==0) printf("2(0)"); //临界点
else if(i==1) printf("2"); //临界点
else if(i==2) printf("2(2)"); //临界点
else{
printf("2(");
power(i); //递归
printf(")");
}
}
}
}
int main(){
int n;
cin>>n;
power(n);
return 0;
}
该程序使用了按位运算和移位运算:
移位运算
左移位运算“a<<b”,可以将a的二进制位左移b位,右边补0,左边移出的丢弃
右移位运算“a>>b”,可以将a的二进制位右移b位,左边补0,右边移动的丢弃
例1:137在4字节表示的情况下为00000000 00000000 00000000 10001001
00000000 00000000 00000000 10001001 >>4 得到:
00000000 00000000 00000000 00001000
00000000 00000000 00000000 10001001 <<4 得到:
00000000 00000000 00001000 10010000
同时可以看到,左移1位在左边没有有效位(1)溢出的情况下,相当于乘2,右移1位相当于除2(只保留整数部分)
按位运算
1. 0&0-->0 0&1-->0 1&0-->0 1&1-->1
2. 0|0-->0 0|1-->1 1|0-->1 1|1-->1
3. ^0-->1 ^1-->0
运算规则见例子:
10101010 & 01010101 ---> 00000000 //170 & 85 ---> 0
10101010 | 01010101 ---> 11111111 //170 | 85 ---> 127
^10101010 ---> 01010101 //^170 ---> 85
^11111111 ---> 00000000 //^127 ---> 0
通过按位、移位运算我们可以对数字的比特位进行操作,但功能不仅限于此,在很多题目中,善用按位和移位运算可以帮助我们轻松解决问题,要善于灵活应用,本题就是一个例子。按位和移位运算都是CPU的基本指令,所以这些运算的效率是比较高的。
自反赋值运算符
和其它运算符一样,按位和移位也有自反赋值运算符,方便使用:
a<<=b //a=a<<b;
a>>=b //a=a>>b;
a&=b //a=a&b;
a|=b //a=a|b;
例程2
#include<iostream>
using namespace std;
void power(int n){
int jishu[16]={0}; //存放级数信息(每个幂次的指数)
int count=0; //有几个加法项 (幂次)
int i=0; //i用于计算指数
while(n){
if(n%2) jishu[count++]=i;
n/=2;
i++; //每做一次除法,指数增加1
}
//这里的思路是:共出现了count次1,第i个1出现的位置是jishu[i],
//所以jishu[i]代表的是第i个1的级数,即2^jishu[i]
for(int i=count-1; i>=0; i--){
if(jishu[i]==0) printf("2(0)"); //临界值
else if(jishu[i]==1) printf("2"); //临界值
else if(jishu[i]==2) printf("2(2)"); //临界值
else{
printf("2(");
power(jishu[i]);
printf(")");
}
if(i!=0) printf("+"); //最后一次不输出“+”
}
}
int main(){
int n;
cin>>n;
power(n);
return 0;
}
NOI-OJ 2.2 ID:8758 2的幂次方表示的更多相关文章
- NOI2.2 8758:2的幂次方表示
描述任何一个正整数都可以用2的幂次方表示.例如: 137=27+23+20 同时约定方次用括号来表示,即ab可表示为a(b).由此可知,137可表示为: 2(7)+2(3)+2(0) 进一步:7=22 ...
- 【noi 2.2_8758】2的幂次方表示(递归)
题意:将正整数N用2的幂次方表示(彻底分解至2(0),2). 解法:将层次间和每层的操作理清楚,母问题分成子问题就简单了.但说得容易,操作没那么容易,我就打得挺纠结的......下面附上2个代码,都借 ...
- [NOI OJ]6044:鸣人和佐助
6044:鸣人和佐助 查看 提交 统计 提问 总时间限制: 1000ms 内存限制: 65536kB 描述 佐助被大蛇丸诱骗走了,鸣人在多少时间内能追上他呢? 已知一张地图(以二维矩阵的形式表示) ...
- 九度OJ 1095:2的幂次方 (递归)
时间限制:1 秒 内存限制:32 兆 特殊判题:否 提交:913 解决:626 题目描述: Every positive number can be presented by the exponent ...
- 递归--练习9--noi8758 2的幂次方表示
递归--练习9--noi8758 2的幂次方表示 一.心得 找准子问题就好 二.题目 8758:2的幂次方表示 总时间限制: 1000ms 内存限制: 65536kB 描述 任何一个正整数都可以用 ...
- SWUST OJ NBA Finals(0649)
NBA Finals(0649) Time limit(ms): 1000 Memory limit(kb): 65535 Submission: 404 Accepted: 128 Descri ...
- 【noi 2.6_9283】&【poj 3088】Push Botton Lock(DP--排列组合 Stirling数)
题意:N个编号为1~N的数,选任意个数分入任意个盒子内(盒子互不相同)的不同排列组合数. 解法:综合排列组合 Stirling(斯特林)数的知识进行DP.C[i][j]表示组合,从i个数中选j个数的方 ...
- 【noi 2.6_9290】&【poj 2680】Computer Transformation(DP+高精度+重载运算符)
题意:给一个初始值1,每步操作将1替换为01,将0替换为10.问N步操作后有多少对连续的0. 解法:f[i]表示第i步后的答案.可以直接打表发现规律--奇数步后,f[i]=f[i-1]*2-1;偶数步 ...
- 【noi 2.6_2000】&【poj 2127】 最长公共子上升序列 (DP+打印路径)
由于noi OJ上没有Special Judge,所以我是没有在这上面AC的.但是在POJ上A了. 题意如标题. 解法:f[i][j]表示a串前i个和b串前j个且包含b[j]的最长公共上升子序列长度 ...
随机推荐
- LeetCode算法题-Kth Largest Element in a Stream(Java实现)
这是悦乐书的第296次更新,第315篇原创 01 看题和准备 今天介绍的是LeetCode算法题中Easy级别的第164题(顺位题号是703).设计一个类来查找流中第k个最大元素.请注意,它是排序顺序 ...
- Python基础——1基础
1.基础 输出 print(‘把子肉爱上热干面’,‘哈哈’) # ‘,’输出为空格 输人 name = input(‘提示的内容’) /浮点除法 %.6f //地板除法 整除 % 取余 pyt ...
- 基于tcp的云盘上传下载的模拟
老师的博客: server端 import json import struct import json import struct import socket import os sk = sock ...
- 第二节 pandas 基础知识
pandas 两种数据结构 Series和DataFrame 一 Series 一种类似与一维数组的对象 values:一组数据(ndarray类型) index:相关的数据索引标签 1.1 se ...
- HBase 数据模型
在HBase中,数据是存储在有行有列的表格中.这是与关系型数据库重复的术语,并不是有用的类比.相反,HBase可以被认为是一个多维度的映射. HBase数据模型术语 Table(表格) 一个HBase ...
- rabbitMQ、activeMQ、zeroMQ、Kafka、Redis 比较
Kafka作为时下最流行的开源消息系统,被广泛地应用在数据缓冲.异步通信.汇集日志.系统解耦等方面.相比较于RocketMQ等其他常见消息系统,Kafka在保障了大部分功能特性的同时,还提供了超一流的 ...
- SQL SUM() 函数
SUM() 函数 SUM 函数返回数值列的总数(总额). SQL SUM() 语法 SELECT SUM(column_name) FROM table_name SQL SUM() 实例 我们拥有下 ...
- 运行ConnectionDemo时遇到的问题及解决方案
20175227张雪莹 2018-2019-2 <Java程序设计> 运行ConnectionDemo时遇到的问题及解决方案 老师博客上提供确认数据库连接的代码 import static ...
- POJ3686 The Windy's
嘟嘟嘟 刚做费用流,思路完全不对呀-- 应该这么想(应该说敢这么想):这道题的关键在于怎么体现这个玩具是第几个加工的,只有这才能求出他的加工时间(因为加工时间包括等待时间). 但等待时间不好求,因此要 ...
- 基于element ui的级联选择器组件实现的分类后台接口
今天在做资产管理系统的时候遇到一个分类的级联选择器,前端是用的element的组件,需要后台提供接口支持. 这个组件需要传入的数据结构大概是这样的,详细的可参考官方案例: [{ value: ...