N!
时间限制:
1000 ms | 内存限制:
65535 KB
难度:
3
-
描述
-
阶乘(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是第四位 - 题解:
- 既然求第一个1的位置,那么前面都是0,只要求出前面有多少个0,再加1便是答案了,具体怎么求有多少个0呢,可以这样想,N!里有多少个2便有多少个0(把阶乘式拆开写再化成求二进制的步骤即可看出)
-
#include<stdio.h> long long int n; long long int we(int a) { int p=0; while(a) { p+=a/2; a=a/2; } return p; } int main() { while(scanf("%d",&n)!=-1) { printf("%d\n",we(n)+1); } }
-