描述

输入一个正整数_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

解决方案

正常的递归到1000会溢出,所以采用利用数组保存不同位输出结果
1、建立数组num[1],初始化n=1时的值
2、建立变量digit_num,记录数的位数,方便遍历循环数的各个位
3、for循环从2开始,建立外循环,初始化进位carry=0,建立内循环,遍历各个位数字,执行操作
4、倒序num数组输出结果

代码实现

def factorial(n):
    num = [1]                          #初始值为1,若n=1,则返回1
    digit_num = 1                      #记录数位
    for i in range(2,n+1):
        carry = 0                      #记录进位
        for j in range(digit_num):
            num[j] = num[j] * i + carry
            carry = num[j] // 10       #进位
            num[j] = num[j] % 10       #取余占位
        if carry > 0:                  #若最后进位显示不为0,则进栈占高位
            digit_num += 1
            num.append(carry)
    for i in range(digit_num-1,-1,-1):#由于数组内元素是从0位开始的,所以需倒序输出
        print(num[i],end='')

factorial(int(input()))

夜未央
1 声望1 粉丝

停留是刹那,转身即天涯


引用和评论

0 条评论