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是第四位 - 来源
- NOJ
- 怎么证明???
-
1 #include<stdio.h> 2 3 int main() 4 { 5 int n,s; 6 while(scanf("%d",&n)>0) 7 { 8 s=1; 9 while(n) 10 { 11 s=s+(n>>=1); 12 } 13 printf("%d ",s); 14 } 15 return 0; 16 }
PID274 / 最末非0位☆
题目描述小笨是个贪玩的小孩,一天到晚都要玩游戏。(这样可不行哦>_<)。有一天晚上,他在电脑上找到了一个游戏,很简单。就是电脑显示一个数n,要你数出n!的最末非0位是什么数。如n=5,n!=120。最末非0位上的数即为2;小笨跟他名字一样有一点笨,总是算不出正确答案,只好找到了你。请你帮帮忙哦^()^.
输入格式仅一行,n.(n<=2000000)
输出格式n的最末非0位
1 #include<iostream> 2 #include<stdio.h> 3 #include<cstring> 4 #include<cstdlib> 5 using namespace std; 6 typedef long long LL; 7 const LL INF = 1000000000000; 8 9 int main() 10 { 11 LL n,i,sum; 12 while(scanf("%lld",&n)>0) 13 { 14 sum=1; 15 for(i=1;i<=n;i++) 16 { 17 sum=sum*i; 18 sum=sum%INF; 19 while(sum%10==0) 20 { 21 sum=sum/10; 22 } 23 } 24 printf("%lld ",sum%10); 25 } 26 return 0; 27 }