51Nod-1057-N的阶乘

来源:互联网 发布:什么的是网络协议 编辑:程序博客网 时间:2024/05/18 03:25

51Nod-1057 N的阶乘

                1057 N的阶乘输入N求N的阶乘的准确值。Input输入N(1 <= N <= 10000)Output输出N的阶乘Input示例5Output示例120

就python而言,直接暴力计算就行,不必担心变量的数据范围。
代码如下:

while True:    try:        n, ans = int(input()), 1        for i in range(1, n+1):            ans *= i        print(ans)    except EOFError:        break

还有一种优化阶乘计算的解法,具体解法的方法在这里就不详细讲解了,在这里打开大佬的博客传送门——N 的阶乘的另一种解法
代码如下:

maxn = 10001#判段素数的数组isprime = [True]*maxn#存入各个素数的阶数cnt = [0]*maxn#素数列表prime = []#素数打表def Prime(n):    for i in range(2, n):        if isprime[i]:            prime.append(i)        for k in prime:            if i*k >= n:                break            isprime[i*k] = False#计算素数的阶数def func(n):    for p in prime:        if p > n:            break        sum = 0        num = p        while num <= n:            sum += n // num            num = num*p        cnt[p] = sum#乘法快速幂def power(a, b):    ans = 1    while b:        if b&1:            ans = ans*a        a = a*a        b >>= 1    return ansPrime(maxn)while True:    try:        n, ans= int(input()), 1        func(n)        for p in prime:            if p > n:                break            ans *= power(p, cnt[p])        print(ans)    except EOFError:        break

此题如果用C语言解题,有些棘手,因为阶乘算出的结果有些连长整型都无法存储。那么就需要分段存入一数组里,每次超过某一个数后,如以1e8为界限,把数据分成两段存入。输出的时候倒序输出数组里存储的结果。
C语言解法的大佬博客—— 51Nod-1057-N的阶乘

原创粉丝点击