51Nod-1057-N的阶乘

51Nod-1057 N的阶乘

                1057 N的阶乘

输入N求N的阶乘的准确值。

Input
输入N(1 <= N <= 10000)

Output
输出N的阶乘

Input示例
5
Output示例
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 ans

Prime(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的阶乘

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值