您的位置:首页 > 编程语言 > Python开发

51Nod-1057-N的阶乘

2017-08-22 10:11 281 查看
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的阶乘
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  python算法