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

时间:2023-03-09 01:37:14
南阳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
怎么证明???
 #include<stdio.h>

 int main()
{
int n,s;
while(scanf("%d",&n)>)
{
s=;
while(n)
{
s=s+(n>>=);
}
printf("%d\n",s);
}
return ;
}

PID274 / 最末非0位☆

题目描述

小笨是个贪玩的小孩,一天到晚都要玩游戏。(这样可不行哦>_<)。有一天晚上,他在电脑上找到了一个游戏,很简单。就是电脑显示一个数n,要你数出n!的最末非0位是什么数。如n=5,n!=120。最末非0位上的数即为2;小笨跟他名字一样有一点笨,总是算不出正确答案,只好找到了你。请你帮帮忙哦^()^.

输入格式

仅一行,n.(n<=2000000)

输出格式

n的最末非0位

 #include<iostream>
#include<stdio.h>
#include<cstring>
#include<cstdlib>
using namespace std;
typedef long long LL;
const LL INF = ; int main()
{
LL n,i,sum;
while(scanf("%lld",&n)>)
{
sum=;
for(i=;i<=n;i++)
{
sum=sum*i;
sum=sum%INF;
while(sum%==)
{
sum=sum/;
}
}
printf("%lld\n",sum%);
}
return ;
}