分享web开发知识

注册/登录|最近发布|今日推荐

主页 IT知识网页技术软件开发前端开发代码编程运营维护技术分享教程案例
当前位置:首页 > 软件开发

codewars--js--Large Factorials--阶乘+大数阶乘

发布时间:2023-09-06 01:50责任编辑:董明明关键词:js

问题描述:

In mathematics, the factorial of integer n is written as n!. It is equal to the product of n and every integer preceding it. For example: 5! = 1 x 2 x 3 x 4 x 5 = 120

Your mission is simple: write a function that takes an integer n and returns the value of n!.

You are guaranteed an integer argument. For any values outside the non-negative range, return nullnil or None (return an empty string "" in C and C++). For non-negative numbers a full length number is expected for example, return 25! = "15511210043330985984000000" as a string.

For more on factorials, see http://en.wikipedia.org/wiki/Factorial

解题思路:

刚开始就是按照寻常情况,直接就用for循环或是递归求阶乘。然后发现js的Number有位数限制(n数相对较大时,会以科学计数法呈现结果;n数很大时,越界,Infinity)。总之就不能像是题目要求的显示所有的数字。

参考博客:https://www.cnblogs.com/h5course/p/7566812.html

得出大数相乘,可以用数组来存储每一位数字,基本求解方法可以类比于小学数学乘法计算。(当24*5时,先用4*5得20,则个位数为0,进位为2;再用2*5+2得12,则十位为2,进位为1,。最后为[0,2,1]。数组倒置后即为乘法结果。)

我的答案:

function factorial(n){ ?// Add some code ?if(n<0){return null;} ?if(n==0 ||n==1){return "1";} ?let result=[1]; ??//result数组存储当前阶乘结果 ?for(let num=2;num<=n;num++){ ???for(let i=0,plus=0 ; i<result.length || plus!=0 ; i++){ ?????let count=(i<result.length)?(num*result[i]+plus):plus; //若当前i小于result所存数字的位数,则分别*num+plus;若等于,则直接进位。 ?????result[i]=count%10; ?//个位、十位、百位……上的数字,存放在数组result中 ?????plus=(count-result[i])/10; ???} ?} ?return result.reverse().join(""); //将数组result倒序后,即为最后的阶乘结果}

优秀答案:

function factorial(n) { ?var res = [1]; ?for (var i = 2; i <= n; ++i) { ???var c = 0; ??//c代表进位 ???for (var j = 0; j < res.length || c !== 0; ++j) { ?????c += (res[j] || 0) * i; ?????res[j] = c % 10; //分别求出个位、十位、百位……的数 ?????c = Math.floor(c / 10); ???} ?} ?return res.reverse().join("");}

另外发现直接用python做,就没有这个问题出现。(用递归方法)

def fun(n): ???if n<0: ???????return null ???elif n==0 or n==1: ???????return "1" ???else: ???????return n*fun(n-1)

用for循环

def fun(n): ???sum=1 ???if n<0: ???????return null ???elif n==0 or n==1: ???????return "1" ???else: ???????for i in range(1,n+1): ???????????sum*=i ???????return sum

哈哈哈!

codewars--js--Large Factorials--阶乘+大数阶乘

原文地址:https://www.cnblogs.com/hiluna/p/8868175.html

知识推荐

我的编程学习网——分享web前端后端开发技术知识。 垃圾信息处理邮箱 tousu563@163.com 网站地图
icp备案号 闽ICP备2023006418号-8 不良信息举报平台 互联网安全管理备案 Copyright 2023 www.wodecom.cn All Rights Reserved