算法很美-位的奇巧淫计(c/c++)
用一个整数判断是不2的整数次方
-----换句话说就是,判断2进制中1的个数是不是只有一个
2---10 4-100
8--- 1000 7 --0111 (n和n-1&的结果0)
6 ---110 5 ---101 (7的结果是1)
只有2次方的结果&才是0
代码如下
#include<bits/stdc++.h>
using namespace std;int main(){int n ;cin>>n;if(n>0&&((n & (n -1)) ==0)){cout<<"yes";}else{cout<<"no";} return 0;}
当然,比较容易想到的就是对n取余
while(!(n%2)){n = n/2;if(n==1){cout<<"yes";return 0;}}cout<<"no" ;
将整数的奇偶位互换
异或运算:相同为0 不同为1
相与运算:只有1&1=1其他情况全都为0
简单举例:9 --1001 ------0110--->6
用0 &就是消除,用1&就是保留原来的
思路来源:https://blog.csdn.net/etalien_/article/details/81179164
将一个二进制数(最后一位默认为第一位 也就是奇数位)的奇数位提取出来,像左移动一位,数的偶数位提取出来,向右移动一位,进而做异或,就可得到交换后的结果
1001
奇数提取 0001 左移 0010
偶数提取 1000 右移 0100
进行异或或者进行相加 0110
现在问题在于,如何进行奇偶位的提取:
用0 &就是消除,用1&就是保留原来的
奇数位: 奇数不变,偶数清0,那就让奇数位与1相与,偶数位与0相与:
这个二级制序列为 0101 0101 0101 0101 0101 0101 0101 0101===》0x55555555
同理偶数位:偶数不变,奇数清0, 那就让奇数位与0相与,偶数位与1相与:
这个二级制序列为 1010 1010 1010 1010 1010 1010 1010 1010 ===》0xAAAAAAAA
代码如下:
#include<bits/stdc++.h>
using namespace std;int main(){int n ;cin>>n;int tmp = ((((n)&0x55555555)<<1)+(((n)&0xAAAAAAAA)>>1));cout<<tmp; return 0;}
乘2挪整二进制表示浮点实数:
题目:给定一个介于0和1之间的实数(如 0.625)类型为double,打印他的二进制表示0.101
如果该数字无法精确地用32为以内的二进制表示默认error
需要注意的是:小数点后的二进制分别表示 0.5 、0.25、 0.125, 位向左移表示乘2,右移表示除2
这里与整数的8421规则类似又不同, 她是乘2,如果结果>=1, 表示的二进制数后写1 ,
乘2后<1, 表示的二进制数后写0;
举例子:0.625*2 =1.25==>0.1---------0.25
0.25*2 = 0.5==>0.10------------0.5
0.5*2 = 1.0==>0.101----------------------0
#include<bits/stdc++.h>
#include<string.h>
#include <iostream>
using namespace std;int main(){double n ;int count = 32;cin>>n;string a ="0.";while(n>0&&count--){n = n*2;int t = n; //n是double类型,int之后只剩整数,就可以判断,整数位示0还是1n =n-t; //将整数位抹去 ,继续进行*2 a+=(t+48); //ascll码从0开始是48 } if(count>0){cout<<a<<endl;}else{cout<<"error";}return 0;}
出现k次与出现一次:
题目:数组中只有一个数出现了1次,其他数都出现了k次,请输出,只出现一次的那个数
比较直接的就是暴力破解,进行计数排查
一个技巧点:2个2进制相加且不进位的结果为0,10个10进制的数相加不进位 结果为0
总结来说就是:k个k进制数相加不进位的结果为0;
本题思路,所有数进行k进制转换,然后做k进制的不进位加法,结果为0 ,进行排除,剩下的就是答案的k进制,然后再转成10进制
难点1:十进制转k进制 在java中integer.tostring(i,k);
难点2: k进制转十进制 a*k的(几次方)+ a*k的(1方)+a*k的(0方)
难点3:不进位加法:相加之后和 对k 取余,结果就是对应位上数值
代码:待完成
算法很美-位的奇巧淫计(c/c++)相关推荐
- 算法很美-位运算-找出落单的那个数
上级目录:算法很美 1. 题目 一个数组里除了某一个数字之外,其他的数字都出现了两次.请写程序找出这个只出现一次的数字. 2. 异或思路 异或的运算是A ^ A=0,也就是说偶数个相同的元素异或,结果 ...
- 算法很美——数学问题
算法很美--数学问题 题1:天平称重 问题描述: 用天平称重时,我们希望用尽可能少的砝码组合称出尽可能多的重量. 砝码重量分别是1,3,9,27,81--3的指数次幂,每种重量砝码只有一个 则它们可以 ...
- 算法之美 | 位运算的巧妙奥秘(一) | JAVA中位运算的深入浅出
文章目录 前言 一.位运算符号 二.位运算的运算规则 扩展 前言 传智杯初赛后有感而写,我目前阶段所学习的算法,只是最基础的数学,对于数字和数学公式还是不敏感,在小卡与质数2那道题,解题的思路只有最基 ...
- 算法很美第一章 位运算的奇巧淫技
第一章 位运算的奇巧淫技 1.2 题解:如何找数组中唯一成对的那个数 知识点: A^A=0 A^0=A(一个数与0进行按位异或,结果是他自己) 对一个序列进行按位异或,可以消除掉序列中的重复项,比如: ...
- 算法很美 将整数的奇偶位互换
大家关注微信公众号 罡罡同学 回复蓝桥杯 可免费获得历年真题和C语言版的真题源代码 将整数的奇偶位互换 题目:将整数的奇偶位互换 (奇偶位:指二进制中的奇偶位) 例:9的二进制 1001,互换后为 0 ...
- 蓝桥杯:算法很美 笔记 3.查找和排序(Python实现)
1.分治法介绍以及关键点解析 分治法(divide and conquer, D&C)∶将原问题划分成若干个规模较小而结构与原问题一致的子问题﹔递归地解决这些子问题,然后再合并其结果,就得到原 ...
- <<算法很美>>——(七)——DFS典题(二):数独游戏
目录 问题描述 问题分析 放码过来: 问题描述 如[图1.png],玩家需要根据9×9盘面上的已知数字,推理出所有剩余空格的数字,并满足每一 行.每一列.每一个同色九宫内的数字均含1-9,不重复. 数 ...
- <<算法很美>>——(三)十大排序算法(上)
目录 前言 冒泡排序 图解冒泡 代码实现 冒泡优化 选择排序 图解选排 代码实现 插入排序 图解插入 代码实现 希尔排序 图解希尔 代码实现: 归并排序 图解归并 代码实现 快速排序 图解快排 ...
- <<算法很美>>——(三)十大排序算法(下)
目录 1. 奇数在左偶数在右 2. 最快效率求出乱序数组中第k小的数 3. 数组中有一个数字出现次数超过数组长度一半 4. 合并两个有序数组 5. 数组中的逆序对 6. 排序数组中两个数字之和 7. ...
最新文章
- hunnu---11547 你的组合数学学得如何?
- 利用matlab点云工具处理点云
- BitComet加速調整法---让你的BT飞起来!
- mysql 安装、建库、导入导出数据
- 【ZOJ4110】Strings in the Pocket (马拉车算法+分析)
- Android-EasyChart第二波饼图
- 欧几里得空间与希尔伯特空间
- 复现贪吃蛇程序——吃食物增加长度(最后一篇)
- shopex PHP Notice,Shopex系统配置文件config.php说明
- 一文读懂单点登录系统对企业的价值
- Tomcat控制台中文乱码怎么处理[已解决 绝对好用]
- c语言作业 分解质因数,深入分析C语言分解质因数的实现方法
- 我是如何从头写一篇顶级论文的
- Excel VBA操作网页 显示滚动进度条
- 12306列车时刻表查询api功能实现
- Power算法求X的N次幂
- Exception at 0x7fefd73a49d, code: 0xe06d7363: C++ exception, flags=0x1 (execution cannot be continue
- android wifi传图片,「教程」将Mac电脑上的照片无线传到安卓手机上
- 智源社区AI周刊No.101:DeepMind推出AlphaTensor登Nature封面;stateof.ai发布AI情况报告...
- 采用AT89C2051的智能时钟