python 如何求N的阶乘

目录
  • 求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)。

以上为个人经验,希望能给大家一个参考,也希望大家多多支持我们。

(0)

相关推荐

  • python计算n的阶乘的方法代码

    整数的阶乘(英语:factorial)是所有小于及等于该数的正整数的积,0的阶乘为1.即:n!=1×2×3×...×n. 首先导入math模块,然后调用factorial()函数来计算阶乘. 1 math.factorial(x) import math value = math.factorial(x) 2. reduce函数 def factorial(n): return reduce(lambda x,y:x*y,[1]+range(1,n+1)) 3. 递归实现 def factori

  • Python 怎么定义计算N的阶乘的函数

    定义计算N的阶乘的函数 1)使用循环计算阶乘 def frac(n): r = 1 if n<=1: if n==0 or n==1: return 1 else: print('n 不能小于0') else: for i in range(1, n+1): r *= i return r print(frac(5)) print(frac(6)) print(frac(7)) 120 720 5040 2)使用递归计算阶乘 def frac(n): if n<=1: if n==0 or n

  • 详解用python计算阶乘的几种方法

    第一种:利用functools 工具处理 import functools result = (lambda k: functools.reduce(int.__mul__, range(1, k + 1), 1))(5) print(result) 第二种:普通的循环 x = 1 y = int(input("请输入要计算的数:")) for i in range(1, y + 1): x = x * i print(x) 第三种:利用递归的方式 def func(n): if n

  • python递归函数求n的阶乘,优缺点及递归次数设置方式

    递归函数两大特点: 1.能够调用函数自身 2.至少有一个出口(结束函数自身调用) 函数实现: def calnum(num): if num != 1: # 递归调用自身函数 csum = num * calnum(num - 1) else: # 设置递归出口 csum = 1 return csum ret = calnum(5) print(ret) 递归函数的缺点: 占用资源多,一般不会优先选择. 一个程序中python默认只允许调用自身1024次,超过这个次数, python解释器会认

  • python 如何求N的阶乘

    目录 求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

  • Python实现求最大公约数及判断素数的方法

    本文实例讲述了Python实现求最大公约数及判断素数的方法.分享给大家供大家参考.具体实现方法如下: #!/usr/bin/env python def showMaxFactor(num): count = num / 2 while count > 1: if num % count == 0: print 'largest factor of %d is %d' % (num, count) break #break跳出时会跳出下面的else语句 count -= 1 else: prin

  • Python实现求两个csv文件交集的方法

    本文实例讲述了Python实现求两个csv文件交集的方法.分享给大家供大家参考,具体如下: #!/usr/bin/env python rd3 = open('data_17_17_2.csv') base = open('data_17_17_3.csv') wr3 = open('delNoBuyed3DayAndStoreAndInCar4.5.2.csv','w+') bsData = base.readlines() i = 1 for key in rd3: if key in bs

  • PHP基于简单递归函数求一个数阶乘的方法示例

    本文实例讲述了PHP基于简单递归函数求一个数阶乘的方法.分享给大家供大家参考,具体如下: 一.问题: 求一个数a的阶乘,那么,a!=a*(a-1)*(a-2)*(a-3)*--*2*1.比如,6的阶乘6!=6*5*4*3*2*1=720.那么,如何通过php代码实现求任意一个数的阶乘? 二.实现代码: <?php function demo($a) { if ($a > 1) { $r = $a * demo($a - 1); } else { $r = $a; } return $r; }

  • Python实现求笛卡尔乘积的方法

    本文实例讲述了Python实现求笛卡尔乘积的方法.分享给大家供大家参考,具体如下: 在数学中,两个集合X和Y的笛卡尓乘积(Cartesian product),又称直积,表示为X × Y,第一个对象是X的成员而第二个对象是Y的所有可能有序对的其中一个成员.假设集合A={a,b},集合B={0,1,2},则两个集合的笛卡尔积为{(a,0), (a,1), (a,2), (b,0), (b,1), (b, 2)}.有时我们需要在python求两个list的笛卡尔乘积,其实很简单,一行代码搞定. 例如

  • 使用C语言求N的阶乘的方法

    用递归法求N的阶乘 程序调用自身称为递归( recursion).它通常把一个大型复杂的问题层层转化为一个与原问题相似的规模较小的问题来求解. 递归的能力在于用有限的语句来定义对象的无限集合. 一般来说,递归需要有边界条件.递归前进段和递归返回段.当边界条件不满足时,递归前进:当边界条件满足时,递归返回. #include <stdio.h> #include <string.h> #include <stdlib.h> long factorial(int n) {

  • Python实现求数列和的方法示例

    本文实例讲述了Python实现求数列和的方法.分享给大家供大家参考,具体如下: 问题: 输入 输入数据有多组,每组占一行,由两个整数n(n<10000)和m(m<1000)组成,n和m的含义如前所述. 输出 对于每组输入数据,输出该数列的和,每个测试实例占一行,要求精度保留2位小数. 样例输入 81 4 2 2 样例输出 94.73 3.41 实现代码: import math while 1: x = raw_input() x = list(x.split(" "))

  • Python编程求质数实例代码

    本文研究的主要是Python编程求质数实例,选取了几个数进行了测试,具体如下. 定义:质数又称素数.一个大于1的自然数,除了1和它自身外,不能被其他自然数整除的数叫做质数:否则称为合数. 我们知道自然数(除了0和1以外)都可以写成几个质数相乘再乘以一的格式,所以我们可以用以个数去试一试看看它能否将小于它的质数整除. 首先我们创建一个空的list,然后我们知道2是最小的质数,于是我们把2添加进这个空白的list,之后我们开始循环,第一个数从3开始,用3除以小于3的质数,没有小于它的质数能被它整除,

  • Python:Numpy 求平均向量的实例

    如下所示: >>> import numpy as np >>> a = np.array([[1, 2, 3], [3, 1, 2]]) >>> b = np.array([[5, 2, 6], [5, 1, 2]]) >>> a array([[1, 2, 3], [3, 1, 2]]) >>> b array([[5, 2, 6], [5, 1, 2]]) >>> c = a + b >

随机推荐