NYOJ 954 求N!二进制末尾几个0

位运算chapter5:提取一个数二进制表达式末位0的个数 是能被一个整数整除的数。例如,12的因数包括:1, 2, 3, 4, 6, 12,因为12能够被这些数整除而没有余数。是一个整数的所有因数中最大的奇数因数。奇数因数是指不能被2整除的因数。一个数的二进制表示末尾0的个数表示该数能够被2连续整除的次数。在函数的调用过程中,'&'引用符号不可以省略,否则k无法被写入。通过位运算,可以高效地计算一个整数末尾0的个数。输入一个正整数,这个数的。先做个因数和最大基因数概念的简易阐述。当然,利用​​​​​​​​​​​​​​。时间复杂度也是O(1)。 阅读详情

NYOJ 954 求N!二进制末尾几个0

题目地址: 
NYOJ 954

题意: 
中文题不解释。

分析: 
即是求N!二进制末尾几个0,换句话就是求N!的因子有几个2。 
具体做法跟POJ 1401一样,题解见:POJ 1401 && ZOJ 2202 Factorial 阶乘N!的末尾零的个数

代码

/*
*  Author:      illuz <iilluzen[at]gmail.com>
*  File:        954.cpp
*  Create Date: 2014-05-26 20:31:42
*  Descripton:   
*/

#include <cstdio>

int n, ans;

int main()
{
	while (~scanf("%d", &n)) {
		ans = 0;
		while (n != 0) {
			ans += n / 2;
			n /= 2;
		}
		printf("%d\n", ans + 1);
	}
	return 0;
}


N的阶乘末尾0的个数和其二进制表示中最后位1的位置 问题一解法: 我们知道N的阶乘结果末尾0的个数也就是说我们在从1做到N的乘法的时候里面产生了多少个10,我们可以这样分解,也就是将从0到N的数分解成因式,再将这些因式相乘,那么里面有多少个10呢?其实我们只要算里面有多少个5就可以了? 因为在这些分解后的因子中,能产生10的可只有5和2相乘了,由于2的个数是大于5的个数的,因此我们只要算5的个数就可以了。那么这个题目就是算这些从1到N... 阅读详情

相关推荐

N!阶乘中结尾0的个数,或结果的二进制表示中最后一个1所在的位置

问题1:阶乘结尾0的个数 要想阶乘的结尾是0,那么这个0已经通过5的倍数乘以另一个数获得,例如:5,10,15,20,25...,同时可以注意到这样一个规律,5,10,15,20,30,35,40与某个数相乘后可以贡献1个0,而25,50,75,100...与某个数相乘可以贡献2个0,5^3, 2* 5^3, 3*5^3与某个数相乘时贡献了3个0,依次类推。同时我们注意到,在统计5,10,15,

bertzhang的专栏 4565

n!末尾0的个数

末尾零的个数,我们会发现计算量太大,就算是计算机也需要许多时间,甚至有数据溢出的风险,而且在测验过程中会有超时的风险,所以我们就有个想法,如果不通过直接计算,而是通过间接计算的方法来获得零的个数,这样不就可以大大减少计算结果所需的时间嘛?我们通过一定的数学运算发现,n!的末尾零的个数,与5这个数字有关。的末尾零的个数是1,10!的末尾个数是2,我们注意到,零的个数与这个阶乘数里有几个5相关。值得注意的是,当输入的数字是25,125,625时,里边分别多了一个、两个、三个五,所以要在出结果时分别加上。

hardy486的博客 181

n!末尾零的个数

分析:n!末尾零的个数,2和5会出来零,末尾0的个数,就是2和5同时出现的次数,要统计2和5出现的次数,易知有,5一定有2,有2不一定有5,所以问题就变成了n中5出现的次数。 #include &lt;stdio.h&gt; int main() { int N; int sum = 0; scanf("%d", &a...

周周的博客 1635

位运算 —— 一个数二进制形式尾端为 0 的个数

所谓一个数二进制形式尾端为 0 的个数,比如对于 40 而言,其二进制形式为 101000,则其尾端为 0 的个数为 3,或者也可简单地返回 2^3 = 8; Java 语言的 Integer 类其实本身就提供了该接口, Integer.numberOfTrailingZeros(n); 如果现在没有类似 Integer 下的接口的话,还有一个较为 tr...

weixin_30914981的博客 693

NYOJ954N!

题目链接:http://acm.nyist.net/JudgeOnline/problem.php?pid=954 统计N!二进制中第一个1的位置(从右向左),转化为N!二进制末尾零的个数,怎么统计? 我们发现,在二进制中,一个数乘以2就是末尾多了0(左移),除以2就是向右移动,所我们统计1到N这些数中有多少个质因数2,就是一个while循环就搞定了。。最后别忘了加1,以为是1的位置

奋斗的Die Young 500

ACM_数论_阶乘N!的末尾几个零 和 末尾有多少个 1 nyoj 954

原文地址 首先阶乘的一个常识要知道就是25!的末尾6位全是0; 前言: 《编程之美》这本书,爱不释手! 问题描述: 给定一个整数N,那么N的阶乘N!末尾有多少个0呢?例如:N=10,N!=362800,N!末尾有两个0; N!二进制表示中最低位1的位置。 问题1的解: 分析: 解法一: 首先,最直接的算法当然是直接出来N!然后看末尾有...

weixin_34378922的博客 139

POJ 1401&&NYOJ 954 N!

分析: 组合数学问题,这两道题是类似的,分别是N!末尾几个0和N!二进制表示低位最近的1的位置(即末尾二进制0的个数+1) 首先来谈下POJ1401, 1)0的个数即是2*5的个数 2)2必然多于5,直接解5的个数即可 3)核心点:任意一个数都可能包含一定的5因子,比如3是0个,10是1个,100是2个(5*5*4)......,那么为找出这所有的5因子,我们可以利用循环的

Walk the horizon 602

nyoj 954

N! 时间限制:1000 ms  |  内存限制:65535 KB 难度:3 描述 阶乘(Factorial)是一个很有意思的函数,但是不少人都比较怕它。现在这里有一个问题,给定一个N(0 输入本题有多组测试数据,每组数据一个正整数N(0 输出N!二进制表示最低位的1的位置(从右向左数)。一组数据占一行。 样例输入 1 2 3 4 样例输出

hexianhao的博客 529

NYOJ954--N的阶乘的二进制表示最低位的1的位置

这个题和51nod1003 原理差不多 51nod1003 都是关于阶乘的一些技巧 题目: 原理: 二进制数 乘上2 末尾会多一个0  再乘一个二 末尾会再多一个0   也就是乘上2^2(2的平方)末尾会多两个0 以此类推  末尾有多少0  怎么算 这个数  的因子中2出现的次数 就是末尾0的个数   而一个数字n的阶乘中某个因子出现的次数  我们的方法之前说过 我们...

1900的博客 531

Nyoj 831 阶乘的0

题目链接:

1105

POJ 1150 The Last Non-zero Digit 数论+容斥

POJ 1150 The Last Non-zero Digit 数论+容斥 题目地址:POJ 1150 题意: 排列P(n, m)后面第一个非0的数。 分析: 为了熟悉题目中的理论。我先做了俩0基础的题目:POJ 1401。题解见:POJ 1401 && ZOJ 220...

weixin_30563319的博客 147

计算n!的十进制表示最后有多少个0(南阳ACM_84)

计算公式     这里先给出其计算公式,后面给出推导过程。     令f(x)表示正整数x末尾所含有的“0”的个数,则有:       当0       当n >= 5时,f(n!) = k + f(k!), 其中 k = n / 5(取整)。 import java.util.Scanner; public class _84 { public static void m

?_#的博客 2264

程序设计:n!末尾有多少个0

问题描述: 计算n!的十进制表示最后有多少个0. 解题思路: 假设n = 100 在1~100当中,可以产生10的有:0 2 4 5 6 8 结尾的数字,可以看出2是确定的,因为4、6、8当中都含有因子2,都可看作是2,那么关键在于5的数量,所以该问题可以转换为出1~100含有多少个5. 由特殊推广到一般的论证过程可得: 1、 每隔5个数,会产生一个0,比如 5, 10 ,15,20. 2 、每隔 5×5 个数会多产生出一个0,比如 25,50,75,100. 3 、每隔 5×5×5 个数会多

沈睿的博客 990

计算n!的十进制表示最后有多少个0

简单实现:#include<stdio.h> #include<stdlib.h> int fun(int n) { int num = 0; int i,j; for (i = 5;i <= n;i += 5) { j = i; while (j % 5 == 0) { num++;

小哥哥咯的博客 2802

计算二进制末尾0的个数

源自 http://www.matrix67.com/blog/archives/3985 unsigned int v;// find the number of trailing zeros in 32-bit vint r;// result goes herestatic const int MultiplyDeBruijnBitPosition[32] ...

weixin_30367945的博客 1563

n!的尾数有多少个零?

问题描述给定参数n(n为正整数),请计算n的阶乘n!末尾所含有“0”的个数。例如,5!=120,其末尾所含有的“0”的个数为1;10!= 3628800,其末尾所含有的“0”的个数为2;20!= 2432902008176640000,其末尾所含有的“0”的个数为4。计算公式这里先给出其计算公式,后面给出推导过程。令f(x)表示正整数x末尾所含有的“0”的个数,则有: 

Shunrei的专栏 2691
上一篇: POJ 1401 && ZOJ 2202 Factorial 阶乘N!的末尾零的个数
下一篇: POJ 1150 The Last Non-zero Digit 数论+容斥
hcbbt
博客等级 码龄14年 1143粉丝 392原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值