求N!的二进制表示中最低位1的值
来源:互联网 发布:java线程讲解 编辑:程序博客网 时间:2024/06/05 19:03
一.问题描述:
求N!的二进制表示中最低位1的值
二.问题分析
首先来看一下一个二进制数除以2的计算过程和结果是怎样的。
把一个二进制数除以2,实际过程如下:
判断最后一个二进制位是否为0,若为0,则将二进制数右移一位,即为商值;反之,若为1,则说明这个二进制数是奇数,无法被2整除。
所以,这个问题实际上等同于求N!含有质因数2的个数。即答案等于质因数2的个数加1。
三.解法1
#include<iostream>
using namespace std;
//计算N! 的质因数2的个数
int totalNubelof2(int n)
{
int count=0;
while(n)
{
count+=n/2;
n=n/2;
}
return count;
}
int main()
{
int n,_2total;
int position;
cin>>n;
//最低位1的位置等于_2total+1
position=totalNubelof2(n)+1;
cout<<position<<endl;
return 0;
}
四.解法2
规律:N!含有质因数2的个数,还等于N减去N的二进制表示中1的个数。
源代码实现:
#include<iostream>
using namespace std;
//计算一个整数二进制表示中1的个数
int GetBitNumOfOne(int nValue)
{
nValue = ((0xaaaaaaaa & nValue)>>1) + (0x55555555 & nValue);
nValue = ((0xcccccccc & nValue)>>2) + (0x33333333 & nValue);
nValue = ((0xf0f0f0f0 & nValue)>>4) + (0x0f0f0f0f & nValue);
nValue = ((0xff00ff00 & nValue)>>8) + (0x00ff00ff & nValue);
nValue = ((0xffff0000 & nValue)>>16) + (0x0000ffff & nValue);
return nValue;
}
//计算2的质因数个数
int total_number_2(int n)
{
int count=0;
int m=n;
count=n-GetBitNumOfOne(m);
return count;
}
int main()
{
int n;
int _2total;
cin>>n;
_2total=total_number_2(n);
cout<<_2total+1<<endl;
}
- 求N!的二进制表示中最低位1的值
- 求N!的二进制表示中最低位1的位置
- 求N!的二进制表示中最低位1的位置
- 求N!的二进制表示中最低位1的位置
- 编程之美---求N!的二进制表示中最低位1的位置
- 求N!的二进制表示中最低位1的位置 ->求 N!的质因子2的个数
- 求N!的二进制表示中最低位1的位置解答题中一个小证明
- 求N!的二进制表示最低位的1的位置(从右向左数)
- 给定一个整数N,那么N的阶乘N!末尾有多少个0呢?求N!的二进制表示中最低位1的位置。
- C程序:n!的二进制表示中最低位1的位置
- 编程之美-2.2、n阶乘的二进制表示中最低位1的位置
- 阶乘N!的二进制表示中最低位1的位置
- 编程之美2——N!的二进制表示中最低位1的位置
- 求n的阶层二进制最低位1的位置
- 求正整数的二进制表示中最低位1的位置
- 求N!二进制最低位1的位置
- 给定一个整数N,求N!末尾有多少个0?N!的二进制表示中最低1的位置?
- 阶乘中最低位0的个数&二进制表示中最低位1的位置
- DB2数据备份和恢复
- uboot替代eboot烧写、启动
- SGIP协议之Report
- 新版ubuntu 双显卡问题
- IronPython 承载和消费WCF服务
- 求N!的二进制表示中最低位1的值
- Java学习体会
- 在struts2 中通过ActionContext访问Session对象
- struts 2中当SESSION过期后返回登陆页面
- Apache commons logging自动查找当前实现Log顺序
- 卡尔卡西25首练习曲简析-音阶与音程训练
- SCJP认证 第二章 面向对象 2.4.2重载方法(1)
- decision
- Python 下载网页