求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
            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 即 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 即 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)。

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

python 如何求N的阶乘的更多相关文章

  1. XCode 3.2 Ruby和Python模板

    在xcode3.2下,我的ObjectiveCPython/Ruby项目仍然可以打开更新和编译,但是你无法创建新项目.鉴于xcode3.2中缺少ruby和python的所有痕迹(即创建项目并添加新的ruby/python文件),是否有一种简单的方法可以再次安装模板?我发现了一些关于将它们复制到某个文件夹的信息,但我似乎无法让它工作,我怀疑文件夹的位置已经改变为3.2.解决方法3.2中的应用程序模板

  2. Swift基本使用-函数和闭包(三)

    声明函数和其他脚本语言有相似的地方,比较明显的地方是声明函数的关键字swift也出现了Python中的组元,可以通过一个组元返回多个值。传递可变参数,函数以数组的形式获取参数swift中函数可以嵌套,被嵌套的函数可以访问外部函数的变量。可以通过函数的潜逃来重构过长或者太复杂的函数。

  3. Swift2.0语言教程之函数嵌套调用形式

    Swift2.0语言教程之函数嵌套调用形式Swift2.0语言函数嵌套调用形式在Swift中,在函数中还可以调用函数,从而形成嵌套调用。以下将对这两种调用进行详细讲解。调用方式如图7.4所示。图7.4函数嵌套的形式以下将使用函数的嵌套调用实现对s=22!这个数值,即调用f1()函数,计算22,结果为4,然后在调用f2()函数,对4的阶乘求取,计算完成22!但是在Swift语言中递归必须要有一个满足结束的条件。

  4. 10 个Python中Pip的使用技巧分享

    众所周知,pip 可以安装、更新、卸载 Python 的第三方库,非常方便。本文小编为大家总结了Python中Pip的使用技巧,需要的可以参考一下

  5. Swift、Go、Julia与R能否挑战 Python 的王者地位

    本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容,请发送邮件至dio@foxmail.com举报,一经查实,本站将立刻删除。

  6. 红薯因 Swift 重写开源中国失败,貌似欲改用 Python

    本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容,请发送邮件至dio@foxmail.com举报,一经查实,本站将立刻删除。

  7. 你没看错:Swift可以直接调用Python函数库

    上周Perfect又推出了新一轮服务器端Swift增强函数库:Perfect-Python。对,你没看错,在服务器端Swift其实可以轻松从其他语种的函数库中直接拿来调用,不需要修改任何内容。以如下python脚本为例:Perfect-Python可以用下列方法封装并调用以上函数,您所需要注意的仅仅是其函数名称以及参数。

  8. Swift中的列表解析

    在Swift中完成这个的最简单的方法是什么?我在寻找类似的东西:从Swift2.x开始,有一些与你的Python样式列表解析相当的东西。(在这个意义上,它更像是Python的xrange。如果你想保持集合懒惰一路通过,只是这样说:与Python中的列表解析语法不同,Swift中的这些操作遵循与其他操作相同的语法。

  9. swift抛出终端的python错误

    每当我尝试启动与python相关的swift时,我都会收到错误.我该如何解决?

  10. 在Android上用Java嵌入Python

    解决方法看看this,它适用于J2SE,你可以尝试在Android上运行.

随机推荐

  1. 10 个Python中Pip的使用技巧分享

    众所周知,pip 可以安装、更新、卸载 Python 的第三方库,非常方便。本文小编为大家总结了Python中Pip的使用技巧,需要的可以参考一下

  2. python数学建模之三大模型与十大常用算法详情

    这篇文章主要介绍了python数学建模之三大模型与十大常用算法详情,文章围绕主题展开详细的内容介绍,具有一定的参考价值,感想取得小伙伴可以参考一下

  3. Python爬取奶茶店数据分析哪家最好喝以及性价比

    这篇文章主要介绍了用Python告诉你奶茶哪家最好喝性价比最高,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习吧

  4. 使用pyinstaller打包.exe文件的详细教程

    PyInstaller是一个跨平台的Python应用打包工具,能够把 Python 脚本及其所在的 Python 解释器打包成可执行文件,下面这篇文章主要给大家介绍了关于使用pyinstaller打包.exe文件的相关资料,需要的朋友可以参考下

  5. 基于Python实现射击小游戏的制作

    这篇文章主要介绍了如何利用Python制作一个自己专属的第一人称射击小游戏,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起动手试一试

  6. Python list append方法之给列表追加元素

    这篇文章主要介绍了Python list append方法如何给列表追加元素,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教

  7. Pytest+Request+Allure+Jenkins实现接口自动化

    这篇文章介绍了Pytest+Request+Allure+Jenkins实现接口自动化的方法,文中通过示例代码介绍的非常详细。对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下

  8. 利用python实现简单的情感分析实例教程

    商品评论挖掘、电影推荐、股市预测……情感分析大有用武之地,下面这篇文章主要给大家介绍了关于利用python实现简单的情感分析的相关资料,文中通过示例代码介绍的非常详细,需要的朋友可以参考下

  9. 利用Python上传日志并监控告警的方法详解

    这篇文章将详细为大家介绍如何通过阿里云日志服务搭建一套通过Python上传日志、配置日志告警的监控服务,感兴趣的小伙伴可以了解一下

  10. Pycharm中运行程序在Python console中执行,不是直接Run问题

    这篇文章主要介绍了Pycharm中运行程序在Python console中执行,不是直接Run问题,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教

返回
顶部