引子:编程之美给出了求N!的二进制最低位1的位置的二种思路,但是呢?但是呢?不信你仔细听我道来。

1、编程之美一书给出的解决思路

问题的目标是N!的二进制表示中最低位1的位置。给定一个整数N,求N!二进制表示的最低位1在第几位?例如:给定N = 3,N!= 6,那么N!的二进制表示(1 010)的最低位1在第二位。

为了得到更好的解法,首先要对题目进行一下转化。

首先来看一下一个二进制数除以2的计算过程和结果是怎样的。

把一个二进制数除以2,实际过程如下:

判断最后一个二进制位是否为0,若为0,则将此二进制数右移一位,即为商值(为什么);反之,若为1,则说明这个二进制数是奇数,无法被2整除(这又是为什么)。

所以,这个问题实际上等同于求N!含有质因数2的个数+1。即答案等于N!含有质因数2的个数加1。 实际上N!都为偶数,因为质因数里面都有一个2,除了1以外,因为1的阶乘是1,是个奇数,其他数的阶乘都是偶数。

2、编程实现 

(1)书中提到的解决方案一:

1 int factLastBinaryOne(int N)

 2 {
 3     int count = ;
 4     while (N)
 5     {
 6         count+=N/;
 7         N=N/;
 8     }
 9     return count+;
 }

(2)书中提到的解决方案二:http://blog.csdn.net/hackbuteer1/article/details/6690015

贴上计算数的二进制表示1的个数的计算方法:

1 int BitCount(int value)

 2 {
 3     int count = ;
 4     while (value)
 5     {
 6         value = value&(value - );
 7         count ++;
 8     }
 9     return count;
 }

则其计算方法是N - BitCount(N!)+1 。

3、我们看看测试用例以及测试结果

1 int main()

 {   
     int sum = ;
     printf("N=%-6d,%4d\n",sum,factLastBinaryOne(sum));
     printf("N=%-6d,%4d\n",sum,sum+-BitCount());
     return ;
 }

看看运行结果:

注意答案不一样哦,但估计是我错了,请各位园友帮我指正一下,共同学习,共同进步。 

[质疑]编程之美求N!的二进制最低位1的位置的问题的更多相关文章

  1. 编程之美——求1~N的整数中1的个数

    为了依次求个位,十位,百位中1的个数,我们可以把这个数字分为三部分,高位数字,当前位数字,低位数字. 如果当前位为0,那么此位为1的数目与高位数字有关 如果当前位为1,那么此位为1的数目与高位和地位都 ...

  2. 求N!的二进制表示中最低位1的位置。(编程之美)

    要求的是N!的二进制表示中最低位1的位置.给定一个整数N,求N!二进制表示的最低位1在第几位?例如:给定N = 3,N!= 6,那么N!的二进制表示(1 010)的最低位1在第二位. 为了得到更好的解 ...

  3. 编程之美 两个叶子的节点之间 最大距离 变种 leecode

    提交地址: https://oj.leetcode.com/problems/binary-tree-maximum-path-sum/ 说一下思路http://www.cnblogs.com/mil ...

  4. 【编程之美】2.5 寻找最大的k个数

    有若干个互不相等的无序的数,怎么选出其中最大的k个数. 我自己的方案:因为学过找第k大数的O(N)算法,所以第一反应就是找第K大的数.然后把所有大于等于第k大的数取出来. 写这个知道算法的代码都花了2 ...

  5. 【编程之美】CPU

    今天开始看编程之美 .第一个问题是CPU的使用率控制,微软的问题果然高大上,我一看就傻了,啥也不知道.没追求直接看答案试了一下.发现自己电脑太好了,4核8线程,程序乱飘.加了一个进程绑定,可以控制一个 ...

  6. 2.2 编程之美--不要被阶乘吓到[zero count of N factorial]

    [本文链接] http://www.cnblogs.com/hellogiser/p/zero-count-of-N-factorial.html [题目] 问题1:‍给定一个整数N,那么N的阶乘N! ...

  7. 编程之美_1.1 让CPU占用率曲线听你指挥

    听到有人说让要写一个程序,让用户来决定Windows任务管理器的CPU占用率. 觉得很好奇.但第一个想法就是写个死循环.哈哈.不知道具体的占用率是多少,但至少能保证在程序运行时,CPU的占用率终会稳定 ...

  8. 南阳oj 求N!的二进制表示最低位的1的位置(从右向左数)。

    N! 时间限制:1000 ms  |  内存限制:65535 KB 难度:3   描述 阶乘(Factorial)是一个很有意思的函数,但是不少人都比较怕它.现在这里有一个问题,给定一个N(0< ...

  9. 编程之美的2.17,数组循环移位 & 字符串逆转(反转) Hello world Welcome => Welcome world Hello

    代码如下:(类似于编程之美的2.17,数组循环移位) static void Main(string[] args) { string input = "Hello World Welcom ...

随机推荐

  1. Elsevier 投稿各种状态总结

    Elsevier 投稿各种状态总结1. Submitted to Journal      当上传结束后,显示的状态是Submitted to Journal,这个状态是自然形成的无需处理.2. Wi ...

  2. 【verilog】fdisplay中如何保存有符号形式

    2014-01-02 10:10:29 参考:http://xilinx.eetop.cn/viewthread-275584 使用系统任务$signed,如 $fdisplay(fp, " ...

  3. [原]zoj3772--【水题】线段树区间查询+矩阵乘法

    思路来源:http://blog.csdn.net/u013654696/article/details/23037407#comments [做浙大校赛的时候没有看这道题,事后做的.思路不是自己的, ...

  4. javascript 一个关于时间排序的算法(一个页面多个倒计时排序)

    上周要做一个活动页面 秒杀列表页 需要一个时间的算法排序 自己琢磨了半天想了各种算法也没搞出来,后来问了下一个后台的php同学 他写了个算法给我看了下 ,刚开始看的时候觉得这就是个纯算法,不能转化成页 ...

  5. BZOJ 2751 容易题

    题目链接:http://61.187.179.132/JudgeOnline/problem.php?id=2751 题意:有一个数列A已知对于所有的A[i]都是1到n的自然数,并且知道对于一些A[i ...

  6. VennDiagram 画文氏图/维恩图/Venn

    install.packages("VennDiagram")library(VennDiagram) A = 1:150B = c(121:170,300:320)C = c(2 ...

  7. 用 eclipse ndk 编译 cocos2d-x for Android

    Android 环境搭建不详述,,可以google,,, 我用的coco2dx 是 2.14 ,2.14 用 create_project.py 脚本创建工程,Python环境配置也是很简单,这里了不 ...

  8. 【Todo】Kerberos、OpenSSL、OAuth2.0等一系列验证权限安全相关学习

    Kerberos可以先从这一篇开始: http://idior.cnblogs.com/archive/2006/03/20/354027.html

  9. 为Gradle添加tomcat插件,调试WEB应用

    Gradle提供了不输于maven的依赖管理 提供了强大的test功能,输出优美的测试报告 并且提供war插件,使用内置的jetty调试WEB应用 因为博主偏偏钟情于tomcat,所以希望使用tomc ...

  10. UVa 11134 (区间上的贪心) Fabled Rooks

    这道题真是WA得我心力交瘁,好讨厌的感觉啊! 简直木有写题解的心情了 题意: n×n的棋盘里,放置n个车,使得任意两车不同行且不同列,且第i个车必须放在给定的第i个矩形范围内.输出一种方案,即每个车的 ...