计算n阶乘的末尾有几个0
一、问题描述:在lintcode上有这么一个问题,如下图所示。设计一个算法,计算出n阶乘中尾部零的个数。
二、尝试
(1)相信很多人看到这个问题的第一个想法就是,先计算n阶乘的结果,然后对10进行求余判断,而被10整除的次数就是尾部零的个数。代码如下:
long long trailingZeros(long long n) {// write your code here, try to do it without arithmetic operators.//计算n阶乘int s=1;for(int i=1;i<=n;i++){s=s*i;}//对结果进行判断int num = 0;//对10进行求余while(s%10==0){num++;s = s/10;}return num;}
看结果,说容易陷入死循环。为什么会陷入死循环呢?n才是105哎,105!等于多少?用了一个在线阶乘计算器计算发现结果很大1.0813967582402912e+168。而int是32位,数据早已溢出,所以,用于存放阶乘结果的s要改成长整型long long int。
(2)再次尝试,发现依然运行超时。看来计算n阶乘占用的空间和时间都比较长。
(3)当我们尝试从1到n逐次计算n阶乘时,会发现一个规律,遇见能被5整除的数时,尾部0就可+1;而尾部的0一共有多少个,就要看这个数包含多少个5的因子。比如1到4的阶乘结果分别为1、2、6、24,5到9的阶乘结果是120、720、5040、40320、362880,10到14的结果分别是3628800、39916800、479001600、6227020800、87178291200,然后15!=1307674368000。也就是5有一个0,10有2个0,15有3个0,20有4个0,25有6个0,30有7个0等等,代码如下
long long trailingZeros(long long n) {// write your code here, try to do it without arithmetic operators.//计算n阶乘long long num = 0;long long temp=n;while(temp){temp /= 5;num += temp;}return num;}
结果
值得注意的一件事就是,其中数据类型的定义,要是long long类型的,这一点题目在定义的时候函数结果上也有提示。
在线计算阶乘的地址http://www.99cankao.com/statistics/factorial-calculator.php
计算n阶乘的末尾有几个0相关推荐
- C语言给定数字n阶乘的末尾计算零个数(附完整源码)
给定数字n阶乘的末尾计算零个数 给定数字n阶乘的末尾计算零个数完整源码(main函数测试) 给定数字n阶乘的末尾计算零个数完整源码(main函数测试) #include <math.h> ...
- 面试题:计算 n!阶乘的结果的末尾有几个0
前言 首先基于一个事实:我们不可能真的把 n! 的结果计算出来,再去数结果的末尾有几个0:n 很小还好,如果n很大,甚至趋近于无穷大,我们是不可能这样做的.原因主要有二: 一般计算机的计算能力和存储能 ...
- C++版本计算n阶乘末尾0的个数原理讲解及代码实现
C++版本计算n阶乘末尾0的个数原理讲解及代码实现 /*! * Copyright (c) 2020,ZYF. * All Rights Reserved. * * \file Factorial.c ...
- android 计算器显示不全,Android5.0 计算器计算结果不准确和结果末尾的多余的‘0’没有省略的解决方法...
Android5.0 计算器计算结果不准确和结果末尾的多余的'0'没有省略 一.问题的描述: [测试步骤] 1.进入计算器 2.输入 100-99.9 3.查看计算结果 [测试结果] 1.结果为: 0 ...
- pku1401 Factorial 计算n!末尾有几个0?
/*Author:yzm求阶乘末尾0的个数因式分解,有多少对2和5,末尾就有多少个0而总是2多5少,所以5的个数决定了0的个数进位思想:先看有多少个5 (v除以5)再看有多少个25 (v再除以5)再看 ...
- 精度计算——大数阶乘
精度计算--大数阶乘 摘自一个 ACM函数模板 ,学习记录自己的理解(^U^)ノ~YO 语法:int result=factorial(int n) 参数:n: n的阶乘 返回值:阶乘的结果 注意: ...
- NUC1013 阶乘结果末尾有多少零【分析思维】
阶乘结果末尾有多少零 时间限制: 1000ms 内存限制: 65536KB 通过次数: 4总提交次数: 14 问题描述 1000的阶乘1*2*3*...*1000结果是一个超过2500位的数,求这么大 ...
- 本题要求实现一个计算非负整数阶乘的简单函数
本题要求实现一个计算非负整数阶乘的简单函数. 函数接口定义: int Factorial( const int N ); 其中N是用户传入的参数,其值不超过12.如果N是非负整数,则该函数必须返回N的 ...
- 简单阶乘计算 (本题要求实现一个计算非负整数阶乘的简单函数)
6.简单阶乘计算 本题要求实现一个计算非负整数阶乘的简单函数. 实现代码: int Factorial(const int N ) {int i,n=1;if(N>=0){for(i=0;i&l ...
最新文章
- Java中创建String的两种方式差异
- LeetCode 289. Game of Life--Java,Python解法
- linux RTX2080显卡驱动
- asp.net C# 将数据导出到Execl汇总
- [半翻] 设计面向DDD的微服务
- Extjs 数据代理
- 统计数据:Google排名高的是什么样的页面?
- RTT内核对象——内核对象的派生
- 2019年12月中国编程语言排行和薪资分析
- 德鲁伊 oltp oltp_内存中OLTP –娱乐看门狗的三个关键点
- Springboot 应用部署建议
- 怎么在InfoPath Web浏览器表单中弹出对话框?
- 第13周 本周个人总结
- 无锁队列详细分解 — 顶层设计
- Android Studio 中 gradle 下载失败的解决办法
- 良品铺子的2021:营收创新高后的“战术调整”
- 一杯茶的时间,上手 Django 框架开发
- 2019腾讯广告算法大赛
- 结构光3D成像原理及应用
- Dell EMC PowerEdge R740 服务器的驱动程序和固件更新