栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Python

蓝桥杯基础练习VIP---阶乘计算

Python 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

蓝桥杯基础练习VIP---阶乘计算

蓝桥杯基础练习VIP---阶乘计算

阶乘计算

该题目实现程序:

方法一:调用python自带函数方法二:递归函数方法三:通过数组实现

阶乘计算

问题描述:
  输入一个正整数n,输出n!的值。其中n!=1乘2乘3*…*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

该题目实现程序: 方法一:调用python自带函数
#方法一:调用python自带函数
import math
print(math.factorial(int(input()))) #返回输入值的阶乘
#example:  math.factorial(5)	 返回x的阶乘 ,结果为120
方法二:递归函数
#方法二:递归函数
n = int(input())
def Factorial(n):
    if n == 1: return 1
    return n * Factorial(n - 1)
print(Factorial(n))
方法三:通过数组实现

第一步,首先定义一个ns数组用来存储n!的各个位数上的数值,利用for循环给ns加入10000个0值,以方便后面直接根据index对数组进行操作。
第二步,然后定义length作为 “数组的长度”(有真实数值的而非自动添加的0) 也即n!的结果的位数。
第三步,之后也必须用到for循环进行累乘,若结果大于等于10则carry>0即向前进一位数值为carry,若j循环结束后carry>0则说明需要在当前ns的“长度”上进一位,所以length+1即位数+1,这里carry起的就是判断是否进位的作用,而length则代表着结果的位数。
重点:发现和小学的时候学的竖式乘法运算过程很相似,从低位数到高位数(ns[j],j in range(0,length))依次与乘数(i)相乘,大于十则进位(carry=temp/10>0,若ns[length]*i+carry > 10则length+1)。

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 = temp // 10  #carry表示前进的位数,24//10=2
            ns[j] = temp % 10  #表示个位数:24%10=4
        while carry > 0:
            ns[length] += carry % 10
            length += 1
            carry = carry//10 #int(carry/10)
while length > 0:
    length -= 1
    print(ns[length], end="")

方法三中利用数组存储实现,可以详见: 链接.

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/768426.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号