求n!,也就是1×2×3×...×n。第一行输入一个正整数n。输出一个正整数,表示n!。c++
时间: 2023-03-08 22:43:14 浏览: 126
答案是:n! = 1 × 2 × 3 × ... × n = n × (n-1)! = n × (n-1) × (n-2)! = ... = n × (n-1) × (n-2) × (n-3)! = ... = n × (n-1) × (n-2) × (n-3) × ... × 1 = n!
相关问题
我们定义n! = 1∗2∗...∗(n-1)∗n,s = 1∗1! + 2∗2! + ...+(n-1)∗(n-1)!,求 s mod n(mod为取余运算)。 输入格式: 输入在一行中给出一个正整数n,2≤n≤1018。 输出格式: 对于输入的n,输出s mod n的结果。
这个问题是一个经典的数学问题,通常称为“中国剩余定理”的简化版本。不过直接计算s mod n可能会因为数值过大导致溢出。我们可以采用一个叫做"累加器"的方法优化计算。
首先,注意到每个乘积(i * i!)都是i的阶乘除以n的余数的乘积。这是因为n能够整除i到n的所有数,所以i!对n取模等于1。这意味着我们实际上只需要找到1!到(n-1)!对n的余数,然后将它们相加再对n取模。
```c
#include<stdio.h>
long long factorial_mod(long long n, long long p) {
long long result = 1;
for (long long i = 1; i <= n; i++) {
result = (result * i) % p;
}
return result;
}
int main() {
long long n;
scanf("%lld", &n);
long long modulos[64]; // 预估n不会超过1e18,取64位长度
long long product = 1;
// 计算每个i!对n的余数并保存至modulos数组
for (int i = 0; i < 64 && product <= n; ++i, product *= 2) {
modulos[i] = factorial_mod(product, n);
}
// 累加并取模
long long ans = 0;
for (int i = 0; i < 64; ++i) {
if ((n >> i) & 1) { // 如果n的第i位是1,则加入当前余数
ans += modulos[i];
if (ans > n) {
ans -= n;
}
}
}
printf("%lld\n", ans);
return 0;
}
```
这个算法避免了直接计算大数阶乘和乘法操作,有效地解决了大数溢出的问题。
阶乘求和(使用函数实现) 描述:输入一个正整数n,写一个函数,计算 1!+2!+3!+...+n! 的和并输出。 函数接口定义: def sumFactorial(n)
好的,你的第一个问题是阶乘求和(使用函数实现)。以下是函数的接口定义:
```python
def sumFactorial(n):
```
函数的功能是计算1!到n!的和。你可以通过以下的代码来实现这个函数:
```python
def factorial(n):
if n == 0:
return 1
else:
return n * factorial(n-1)
def sumFactorial(n):
sum = 0
for i in range(1, n+1):
sum += factorial(i)
return sum
```
在这个实现中,我们首先定义了一个名为`factorial`的函数,用于计算给定整数的阶乘。然后在`sumFactorial`函数中,我们使用循环计算了1!到n!的和,并将结果返回。
希望这个解答能够帮助你解决你的问题!
阅读全文