python 如何求N的阶乘

Tani ·
更新时间:2024-09-21
· 1627 次阅读

目录

求N的阶乘

实现阶乘的三种解法

解法一:循环

解法二:递归

解法三:数组

①i=1

②i=2

③i=3

④i=4

⑤i=5

求N的阶乘

本题要求编写程序,计算N的阶乘。

输入格式:

输入在一行中给出一个正整数 N。

输出格式:

在一行中按照“product = F”的格式输出阶乘的值F,请注意等号的左右各有一个空格。题目保证计算结果不超过双精度范围。

输入样例:

5

输出样例:

product = 120

x = int(input()) a = 1 for i in range(1, x+1):     a = a*i print("product = %d" % float(a)) 实现阶乘的三种解法

问题描述:

输入一个正整数n,输出n!的值。

其中n!=123*…*n。

算法描述:

n!可能很大,而计算机能表示的整数范围有限,需要使用高精度计算的方法。使用一个数组A来表示一个大整数a,A[0]表示a的个位,A[1]表示a的十位,依次类推。

将a乘以一个整数k变为将数组A的每一个元素都乘以k,请注意处理相应的进位。

首先将a设为1,然后乘2,乘3,当乘到n时,即得到了n!的值。

输入格式:

输入包含一个正整数n,n<=1000。

输出格式:

输出n!的准确值。

样例输入:

10

样例输出:

3628800

看到这题我首先想到的是两种比较简单的解法,一是循环,二是递归。

解法一:循环 n = int(input()) ns = 1 for i in range(1,n+1):     ns = ns*i print(ns)

思路比较简单,就是定义一个变量ns赋予一个初始值1,然后利用for循环直接累乘得到最终结果。

解法二:递归 def factorial(n):     if n==1:         return n     else:         return n*factorial(n-1) n = int(input()) res = factorial(n) print(res)

递归也比较好理解,当n == 2,return 2 * 1;n == 3,return 3*(2 * 1);n==4,return 4*(3*(2*1))。以此类推,再将最终的结果赋予res将其打印即可。

这两种方法都比较简单,但很显然都不符合题目要求的 “使用一个数组A来表示一个大整数a,A[0]表示a的个位,A[1]表示a的十位”,所以我们要想办法利用数组来得到n!的结果。

解法三:数组 n= int(input()) ns = [0 for i in range(10000) ] length = 1 ns[0] = length = 1 if n>=2:     for i in range(2,n+1):         carry = 0         for j in range(length):             temp = ns[j] * i + carry             carry = int(temp/10)             ns[j] = temp % 10         while carry>0:             ns[length] += carry%10             length+=1             carry = int(carry/10) while length>0:     length -=1     print(ns[length],end='')

接下来我讲下思路:

首先定义一个ns数组用来存储n!的各个位数上的数值,利用for循环给ns加入10000个0值,以方便后面直接根据index对数组进行操作。

然后定义length作为 “数组的长度”(有真实数值的而非自动添加的0) 也即n!的结果的位数。

之后也必须用到for循环进行累乘,但跟解法一的直接累乘不同,这里是乘数(即i)跟各个位上的数分别相乘,若结果大于等于10则carry>0即向前进一位数值为carry,若j循环结束后carry>0则说明需要在当前ns的“长度”上进一位,所以length+1即位数+1,这里carry起的就是判断是否进位的作用,而length则代表着结果的位数。可能这么说有些抽象,下面我们通过分解运行过程来更直观的阐述上面的想法。

例如我们现在需要求5!,分五步,即i循环5次:

①i=1     ns[0] = length =1 , carry = 0     ∴j in range(1)

⑴ j=0

    temp = ns[j] * i + carry = ns[0] * i + carry =1*1+0=1  # temp为第j位数与i相乘并加上j-1位数与i相乘后进位的值的结果     carry = int(temp/10) = 1/10 = 0      # carry=0所以不用进位     ns[j] = temp % 10 即 ns[0] = 1 % 10 =1   #只取个位数值作为第j位的值 ②i=2     ns[0] = 1, length =1 , carry = 0     ∴j in range(1)

⑴ j=0

    temp = ns[j] * i + carry = ns[0] * i + carry =1*2+0=2  # temp为第j位数与i相乘并加上j-1位数与i相乘后进位的值的结果     carry = int(temp/10) = 2 / 10 = 0      # carry=0所以不用进位     ns[j] = temp % 10 即 ns[0] = 2 % 10 =2   #只取个位数值作为第j位的值     #这样就已经的到2!的值了即2 ③i=3     ns[0] = 2, length =1 , carry = 0     ∴j in range(1)

⑴ j=0

    temp = ns[j] * i + carry = ns[0] * i + carry =2*3+0=6  # temp为第j位数与i相乘并加上j-1位数与i相乘后进位的值的结果     carry = int(temp/10) = 6 / 10 = 0      # carry=0所以不用进位     ns[j] = temp % 10 即 ns[0] = 6 % 10 =6   #只取个位数值作为第j位的值     #这样就已经的到3!的值了即6 ④i=4     ns[0] = 6, length =1 , carry = 0     ∴j in range(1)

⑴ j=0

    temp = ns[j] * i + carry = ns[0] * i + carry =6*4+0=24  # temp为第j位数与i相乘并加上j-1位数与i相乘后进位的值的结果     carry = int(temp/10) = 24 / 10 = 2      # carry=2>0所以需要向前进2     ns[j] = temp % 10 即 ns[0] = 24 % 10 =4   #只取个位数值作为第j位的值

j循环结束,carry>0执行while循环

    while carry>0:                     ns[length] += carry%10 即 ns[1] += 2 % 10 = 2  #carry = 2 所以向前进2             length+=1 即 length =1+1=2 #位数加一             carry = int(carry/10) = 2 / 10 = 0 # carry = 2<10所以不需要继续进位,while循环结束             ∴length = 2 , ns[0] = 4 ,ns[1] = 2     #这样就得到4!的值ns[1]*10+ns[0] 即 24,输出时可直接倒着打印然后end=''而不需要每位数乘10*n再相加 ⑤i=5     ns[0] = 4, ns[1] = 2 length =2 , carry = 0     ∴j in range(2)

⑴ j=0

    temp = ns[j] * i + carry = ns[0] * i + carry =4*5+0=20  # temp为第j位数与i相乘并加上j-1位数与i相乘后进位的值的结果     carry = int(temp/10) = 20 / 10 = 2      # carry=2>0所以需要向前进2     ns[j] = temp % 10 即 ns[0] = 20 % 10 =0   #只取个位数值作为第j位的值

⑵ j=1

    temp = ns[j] * i + carry = ns[1] * i + carry =2*5+2=12  # temp为第j位数与i相乘并加上j-1位数与i相乘后进位的值的结果     carry = int(temp/10) = 12 / 10 = 1      # carry=1>0所以需要向前进1     ns[j] = temp % 10 即 ns[1] = 12 % 10 =2   #只取个位数值作为第j位的值

j循环结束,carry>0执行while循环

    while carry>0:                     ns[length] += carry%10 即 ns[2] += 1 % 10 = 1  #carry = 1 所以向前进2             length+=1 即 length =2 +1 = 3 #位数加一             carry = int(carry/10) = 1 / 10 = 0 # carry = 1<10所以不需要继续进位,while循环结束             ∴length = 3 , ns[0] = 0 , ns[1] = 2 , ns[2] = 1     # 这样就得到5!的值ns[2] ns[1] ns[0]即 120

这样看下来是否发现和小学的时候学的竖式乘法运算过程很相似,从低位数到高位数(ns[j],j in range(0,length))依次与乘数(i)相乘,大于十则进位(carry=temp/10>0,若ns[length]*i+carry > 10则length+1)。

以上为个人经验,希望能给大家一个参考,也希望大家多多支持软件开发网。



阶乘 Python

需要 登录 后方可回复, 如果你还没有账号请 注册新账号