2.2 不要被阶乘吓倒

2024-05-15 16:08
文章标签 2.2 阶乘 不要 吓倒

本文主要是介绍2.2 不要被阶乘吓倒,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

问题描述

1、给定一个整数N,阶乘N!末尾有多少个0

2、求N!的二进制表示中最低位1的位置

1、给定一个整数N,阶乘N!末尾有多少个0

举例:10!=3 628 800,则 N!的末尾有两个0

思路:

 

即,知道 Z ,就知道N!中含有0的个数

方法一:求出1~N中每一个数被5整除的因子的个数,比较笨

代码:

int FindZeroNum(int n) {int ret = 0;for(int i = 1; i <= n; ++i) {int j = i;while(j % 5 == 0) {ret ++;j /= 5;}}return ret;
}

方法二:


举例:N = 25 ,即1~25

5的倍数(5,10,15,20,25)贡献一个5

25的倍数贡献一个5

虽然25可以贡献两个5,但是已经在5的倍数中贡献一次了,所以这里就统计一次

也就是说,对于每一个5 ^M,N只统计一次5,虽然它本身有多个5的质因数,但是已经在前面M-1计算过,所以只需统计一次即可

代码

int FindZeroNum(int n) {int ret = 0;while(n) {ret += n / 5;n /= 5;}return ret;
}


2、求N!的二进制表示中最低位1的位置

举例:N = 3,N! = 6,6的 二进制1010 最低位1在第二位

问题分析

方法一:

代码

int FindZeroNum(int n) {int ret = 0;while(n) {n >>= 1;ret += n;}return ret;
}
代码说明:

假设是8! 有1 2 3 4 5 6 7 8

第一次循环: 则它有 2 4 6 8四个具有2的质因数

第二次循环: 2 4 6 8变为 1 2 3 4 则只有 2 4具有2的质因数

第三次循环:2 4 变为 1 2 则只有2 具有2的质因数


方法二:


代码

[cpp]  view plain copy
  1. /*nNum的二进制中包含1的个数*/  
  2. int FindOneNum(int nNum)  
  3. {  
  4.     int nCount = 0;  
  5.     while(nNum)  
  6.     {  
  7.         nCount++;  
  8.         nNum = nNum & (nNum - 1);  
  9.     }  
  10.     return nCount;  
  11. }  
  12. /*nNum中最低1的位置*/  
  13. int FindLowestOne(int nNum)  
  14. {  
  15.     assert(nNum > 0);  
  16.     return nNum - FindOneNum(nNum) + 1;  
  17. }  


思考题

给定正整数N,判断其是否为2的方幂

问题等价于:判断 N 的二进制表示中是否只有一位为1

方法:

[cpp]  view plain copy
  1. 即为判断条件:N >0 且 N & (N-1) = 0   

这篇关于2.2 不要被阶乘吓倒的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/992285

相关文章

Python实现阶乘的四种写法

《Python实现阶乘的四种写法》本文主要介绍了Python实现阶乘的六种写法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧... 目录第一种:推导式+循环遍历列表内每个元素相乘第二种:调用functools模块reduce的php累计

uva 10061 How many zero's and how many digits ?(不同进制阶乘末尾几个0)+poj 1401

题意是求在base进制下的 n!的结果有几位数,末尾有几个0。 想起刚开始的时候做的一道10进制下的n阶乘末尾有几个零,以及之前有做过的一道n阶乘的位数。 当时都是在10进制下的。 10进制下的做法是: 1. n阶位数:直接 lg(n!)就是得数的位数。 2. n阶末尾0的个数:由于2 * 5 将会在得数中以0的形式存在,所以计算2或者计算5,由于因子中出现5必然出现2,所以直接一

c++习题30-求10000以内N的阶乘

目录 一,题目  二,思路 三,代码    一,题目  描述 求10000以内n的阶乘。 输入描述 只有一行输入,整数n(0≤n≤10000)。 输出描述 一行,即n!的值。 用例输入 1  4 用例输出 1  24   二,思路 n    n!           0    1 1    1*1=1 2    1*2=2 3    2*3=6 4

模具要不要建设3D打印中心

随着3D打印技术的日益成熟与广泛应用,模具企业迎来了自建3D打印中心的热潮。这一举措不仅为企业带来了前所未有的发展机遇,同时也伴随着一系列需要克服的挑战,如何看待企业引进增材制造,小编为您全面分析。 机遇篇: 加速产品创新:3D打印技术如同一把钥匙,为模具企业解锁了快速迭代产品设计的可能。企业能够迅速将创意转化为实体模型,缩短产品从设计到市场的周期,抢占市场先机。 强化定制化服务:面

高精度加法,乘法,阶乘

#include <iostream>#include <map>#include <string>#include <algorithm>using namespace std;const int Max = 50000;string str1,str2;/***********乘法***********/void chenfa(){cin >> str1>>str2;int a

大家不要退小黄车的押金了

大家好,首先我不是ofo的任何人,我只是一名小黄车的使用者,从去年开始就一直关注这ofo、摩拜的信息,最近这段时间ofo陷入了囧境,大家都担心自己的押金,全都去退还押金,这样无疑是给ofo有一层打击,因为本来资金已经很紧张了,ofo的用户也不在少数,没有资本的涌入,它也挺可怜的,它去哪里给你们退钱呢。           ofo的诞生,给我们提供了方便我们是毋庸置疑的,不光是

社交平台找旅游搭子一起旅行靠谱吗?答案是不要太爽!

哈喽小伙伴们,今天要跟大家分享一个超级棒的小程序——咕哇找搭子!作为一个热爱自由行的人,最头疼的就是找不到志同道合的小伙伴。但自从用了这个咕哇小程序后,一切都变得简单又充满乐趣啦!🎉 上个月,我计划去云南旅行,就试着在咕哇上发布了我的行程信息。没想到很快就收到了几位朋友的回应,其中一位叫小莲的朋友特别投缘。我们不仅目的地一样,就连兴趣爱好都出奇地相似,于是我们就决定一起出发啦!👭

【LeetCode】:面试题 16.05. 阶乘尾数

🎁个人主页:我们的五年 🔍系列专栏:C++课程学习 🎉欢迎大家点赞👍评论📝收藏⭐文章   好久没有写文章了,今天碰见了一道有趣的题目,写下来分享一下。 🏆1.问题描述:  🏆2.问题分析: 🎲优化一: 首先看到这道题的时候,暴力肯定是不行的,n的阶乘可能会是一个很大的数,肯定是会超过int,long long的范围的。 然后再去想其他的方法优

C/C++的阶乘求和以及变量存储数据大小

目录 1. 前言 2. 正文 2.1 问题 2.2 解决办法 2.2.1 思路 2.2.2 代码实现 2.2.3 测试结果 3. 备注 1. 前言 其实刚学C语言的时候,打击都会先认识,类型,像int,double之类的存储类型。在这篇文章中,就需要大家对这个大小有了解。 2. 正文 2.1 问题 题目描述: 一个正整数如果等于组成它的各位数字的阶乘之和,该整数

新型PyPI攻击技术可能导致超2.2万软件包被劫持

一种针对 Python 软件包索引(PyPI)注册表的新型供应链攻击技术已在野外被利用,并且目前正试图渗透到下游组织中。 软件供应链安全公司 JFrog 将其代号定为Revival Hijack,并称这种攻击方法可用于劫持 2.2万个现有 PyPI 软件包,并导致数十万次恶意软件包下载。这些易受攻击的软件包下载量已超过 10 万次,或已活跃超过 6 个月。 JFrog安全研究人员And