-
描述
-
阶乘(Factorial)是一个很有意思的函数,但是不少人都比较怕它。现在这里有一个问题,给定一个N(0<0<1000000000),求N!的二进制表示最低位的1的位置(从右向左数)。
-
输入
- 本题有多组测试数据,每组数据一个正整数N(0<0<1000000000),以EOF结束 输出
- 求N!的二进制表示最低位的1的位置(从右向左数)。一组数据占一行。 样例输入
-
1 2 3 4
样例输出
-
1 2 2 4
提示
-
2! = (2)10 = (10)2,则第一个1是第二位
3! = (6)10 = (110)2,则第一个1是第二位
4! = (24)10 = (11000)2,则第一个1是第四位
思路:这题就是求N!中的质因数2的个数,因为每多一个2,N!的二进制数末位就会多一个0。
网上有个求N!的质因数2的个数的公式N/2 + N/4 + N/8 + N/16 + .......对于这个公式的推导:
因为只有偶数有质因数2,所以只考虑偶数。1->N中有N/2个偶数,所以有N/2个质因数,
然后把N/2个偶数除于2,就剩下了N/4个偶数,所以有N/4个质因数,然后再除于2......
以此类推:所以质因数2的个数为N/2+N/4+N/8+N/16+......
#include <cstdio> using namespace std; int main() { int n; while(scanf("%d", &n) != EOF) { int num = 0; while(n) { n >>= 1; num += n; } printf("%d\n", num + 1); } return 0; }
NYOJ-954-N!
最新推荐文章于 2017-06-03 16:59:25 发布