The factorial of an integer N, written N!, is the product of all the integers from 1 through N inclusive. The factorial quickly becomes very large: 13! is too large to store in a 32-bit integer on most computers, and 70! is too large for most floating-point variables. Your task is to find the rightmost non-zero digit of n!. For example, 5! = 1 * 2 * 3 * 4 * 5 = 120, so the rightmost non-zero digit of 5! is 2. Likewise, 7! = 1 * 2 * 3 * 4 * 5 * 6 * 7 = 5040, so the rightmost non-zero digit of 7! is 4.
PROGRAM NAME: fact4
INPUT FORMAT
A single positive integer N no larger than 4,220.
SAMPLE INPUT (file fact4.in)
7
OUTPUT FORMAT
A single line containing but a single digit: the right most non-zero digit of N! .
SAMPLE OUTPUT (file fact4.out)
4
题意:
给出一个数 N (1 ~ 4220),求出 N!,输出最右第一个非零的数。
思路:
数学。我的做法是直接保存后面的 K 位数,一旦有 0 就不断删除 0,最后输出 % 10 的答案即可。
官方解答是找出 2 和 5 的对数,因为 2 X 5 或者 5 X 2 是使末尾变为 0 的关键,所以找出 1 ~ N 中因子 2 的个数和因子 5 的个数,排除最大对数的 2 和 5 之后,剩下的数相乘就不会产生进位了,那么直接保存最后一位相乘的结果就好。因为 2 的个数肯定要比 5 的个数多,所以 5 的个数即为最大的对数,所以最后还要乘上剩下未匹配的 2,即乘上 (n5 - n2)个 2 后才是结果。
AC1:
/* TASK:fact4 LANG:C++ ID:sum-g1 */ #include <cstdio> #include <cstring> #include <algorithm> using namespace std; typedef long long ll; int main() { freopen("fact4.in", "r", stdin); freopen("fact4.out", "w", stdout); int n; scanf("%d", &n); ll last = 1; for (int i = 1; i <= n; ++i) { last *= i; while (!(last % 10)) last /= 10; last %= 100000000000; } printf("%lld\n", last % 10); return 0; }
AC2:
/* TASK:fact4 LANG:C++ ID:sum-g1 */ #include <cstdio> #include <cstring> #include <algorithm> using namespace std; int main() { freopen("fact4.in", "r", stdin); freopen("fact4.out", "w", stdout); int n; scanf("%d", &n); int n2 = 0, n5 = 0, last = 1; for (int i = 1; i <= n; ++i) { int j = i; while (!(j % 2)) { ++n2; j /= 2; } while (!(j % 5)) { ++n5; j /= 5; } last = (last * j) % 10; } for (int i = 1; i <= n2 - n5; ++i) last = (last * 2) % 10; printf("%d\n", last); return 0; }
相关推荐
C#,阶乘(Factorials)的递归、非递归、斯特林近似及高效算法与源代码 阶乘是基斯顿·卡曼(Christian Kramp,1760~1826)于 1808 年发明的运算符号,是数学术语。 一个正整数的阶乘(factorial)是所有小于及等于...
`squfof.cpp`可能是实现SQUFOF(Sequitur QUadra-Factoring Of Factorials)算法的代码,这是一种寻找素因子的算法,特别适合于分解大整数。SQUFOF算法在大数因式分解领域有一定的应用价值。 `VeryLong.cpp`和`...
阶乘在数学中是一个非常基础且重要的概念,它在计算机科学和编程中也有广泛的应用,尤其是在算法和组合数学中。阶乘表示为一个正整数 n 的阶乘(表示为 n!),是所有小于及等于 n 的正整数的乘积。例如,5!(5的阶乘...
这个问题虽然简单,但它触及了数学和计算机科学的基础,并且可以通过扩展思考,比如优化算法(如动态规划或记忆化搜索)来减少重复计算,或者探讨当 n 增大时,序列和的增长模式,这将涉及高阶数学中的无穷级数和...
用数学方法得出大集合有多少个排列 计算子集的排列 通过重复和替换计算排列 通过计数定义样本空间 让我们考虑以下示例。 下周,碧昂丝致敬乐队“ The Single Ladies”将在您当地的公园里播放免费的迷你演出。 他们...
目标你将能够: 用数学方法得出大集合有多少个排列计算子集的排列通过重复和替换计算排列关于阶乘的注释在上一课中,我们讨论了在覆盖范围内创建清单的情况下的排列。 我们想计算在订购清单中订购3首歌曲的方式。 ...
用数学方法得出大集合有多少个排列 计算子集的排列 通过重复和替换计算排列 关于阶乘的注释 在上一课中,我们讨论了在覆盖范围内创建清单的情况下的排列。 我们想计算在订购清单中订购3首歌曲的方式。 我们可以为此...
目标你将能够: 描述阶乘与排列的关系用数学方法得出大集合有多少个排列计算子集的排列通过重复和替换计算排列通过计数定义样本空间让我们考虑以下示例。 下周,碧昂丝致敬乐队“ The Single Ladies”将在您当地的...
用数学方法得出大集合有多少个排列 计算子集的排列 通过重复和替换计算排列 关于阶乘的注释 在上一课中,我们讨论了在覆盖范围内创建清单的情况下的排列。 我们想计算在订购清单中订购3首歌曲的方式。 我们可以为此...
用数学方法得出大集合有多少个排列 计算子集的排列 通过重复和替换计算排列 关于阶乘的注释 在上一课中,我们讨论了在覆盖范围内创建清单的情况下的排列。 我们想计算在订购清单中订购3首歌曲的方式。 我们可以为此...
1. **伽马函数与相关函数**:伽马函数(Γ函数)是所有正实数的阶乘推广,SpecialFunctions.jl实现了伽马函数、下伽马函数、上伽马函数以及它们的离散形式,如Pochhammer符号和rising/falling factorials。...
7. **3.2.1 Factorials**:这可能是关于数值计算的问题,需要高效地计算大整数的阶乘,可能需要用到递归、循环或斯特林公式。 8. **1.2.5 Dual Palindromes**:双回文问题可能需要检查字符串是否既是正读也是反读的...
std::cout << "The sum of the factorials of " ; return 0; } ``` 在`main`函数中,我们首先声明了两个变量`num1`和`num2`,分别赋值为5和6。然后,我们计算它们各自的阶乘并相加,最后将结果输出到控制台。 这...
在编程领域,阶乘是一个非常基础且重要的概念,特别是在数学和计算机科学的交界处。阶乘表示一个正整数n的所有小于等于n的正整数的乘积,通常用"!"表示。例如,5的阶乘(5!)等于5 x 4 x 3 x 2 x 1 = 120。阶乘在...
- **系统输出格式化**:如`System.out.printf("the factorial of %s is %s", inputn, factorials);`展示了如何使用`printf`方法来格式化输出字符串。`printf`可以像C语言中的同名函数一样,通过格式化字符串来控制...
- **数学运算**: 使用模运算(%)和整除运算(//)来提取数字的各位数字。 **代码示例:** ```python def is_narcissistic(num): digits = [int(d) for d in str(num)] return num == sum(d ** 3 for d in digits...
Over1,100 common series, all grouped for easy reference.... binomials, simple inverse products, factorials, trigonometrical and hyperbolic expansions, and additional series. 1961 edition.
22. **阶乘求和(Sum of Factorials)** - **描述**:题目要求计算1! + 2! + ... + 20! 的和。 - **知识点**: - 循环结构:使用 `for` 循环计算阶乘。 - 数学运算:阶乘运算。 - 累加操作:累加每一项的阶乘...
在Java编程语言中,"ds03tsh 1到7的阶乘的和"是一个典型的数学计算问题,涉及到序列的求和与阶乘运算。阶乘是指从1乘到某个正整数n的所有整数的乘积,表示为n!(n factorial)。在这个问题中,我们需要计算1到7每个...
通过实践这些习题,我们可以进一步理解C语言的基本语法、循环控制结构以及数学运算的实现。同时,这也为我们提供了运用递归、数据类型转换和浮点数运算等进阶技巧的机会。在实际编程过程中,不断练习和解决问题是...