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

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 }
原文地址:https://www.cnblogs.com/tom987690183/p/3696073.html