计算一个整数(N)的阶乘的位数

对于一个正整数N, 计算N! 的位数。例如N=4, 4!=24,那么位数就是2。

直接计算N!的数值,然后再去数位数,这个很难,因为N!很有可能超过int(32bit) 或long(64bit)的表达范围。

换一种思路,假设要求的位数为x, 那么一定满足 10^(x-1) <=N!<10^x。两边取10为底的对数,得到x-1<=log10(N!)<x。最终x 取 int(log10(N!))+1.

log10(N!) = log10(N)+log10(N-1)+log10(N-2)+...+log10(1)

代码如下:

import math

def digitsNumOfFactorialN(n):
    sum = 0
    for i in range(1,n+1):
        sum +=math.log10(i)
    return int(sum)+1

  

在网上找到另外一种快速解法,不用循环。利用如下公式:

log10(n!) = log10(sqrt(2 * PI * n)) + n * log10(n / e)

其中PI是圆周率,e为自然对数。不过我是记不住这个公式啊。

原文地址:https://www.cnblogs.com/taoge305/p/10553727.html

时间: 2024-10-14 14:32:37

计算一个整数(N)的阶乘的位数的相关文章

计算一个大数n的阶乘的位数宽度(十进制)转载

计算一个大数n的阶乘的位数宽度(十进制)(log i累加法 )转载 输入: 每行输入1个正整数n, (0<n<1000 000) 输出: 对于每个n,输出n!的(十进制)位数. 分析: 这道题采用蛮力法.根据定义,直接求解! 所谓n!的十进制位数,就是 log(n)+1, 根据数学公式有:n!=1*2*3*.....*n; lg(n!)=lg(2)+......lg(n); 代码: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22

计算一个大数n的阶乘的位数宽度(十进制)(log i累加法 )

输入: 每行输入1个正整数n, (0<n<1000 000) 输出: 对于每个n,输出n!的(十进制)位数. 分析: 这道题采用蛮力法.根据定义,直接求解! 所谓n!的十进制位数,就是 log(n)+1, 根据数学公式有:n!=1*2*3*.....*n; lg(n!)=lg(2)+......lg(n); 代码: //输入一个数字n,请你计算该数的阶乘的十进制数的位数宽度 //比如:3!=6, 则宽度为1 //样例数据: //n=3 输出1 //n=32000 输出130271 //n=10

怎样计算一个整数的位数&amp;并把每一位上的数字保存下来

用循环来解决~~ M每次除以10, 再用一个变量count来计数,每循环一次 加1,直到这个数除去10后的数小于10 ,count再加1就可以了 实例:整数M=4325, 第一次:4325/10=432,M结果不为0,cout=1; 第一次:432/10=43,M结果不为0,cout=2; 第三次:43/10=4,M结果不为0,count=3; 第四次:M为4,结果不为0,count=4;但是M/10为0,循环结束了 至于保存一个整数的每一位数,我们可以用最常规的方法,用取模(%)和相除(/)连

FCC JS基础算法题(1):Factorialize a Number(计算一个整数的阶乘)

题目描述: 如果用字母n来代表一个整数,阶乘代表着所有小于或等于n的整数的乘积.阶乘通常简写成 n!例如: 5! = 1 * 2 * 3 * 4 * 5 = 120. 算法: function factorialize(num) { // 请把你的代码写在这里 var result = 1; for(var i=2;i <= num;i++){ result *= i; } return result; } factorialize(1); 原文地址:https://www.cnblogs.co

计算一个整数的二进制中1的个数

问题: Write a function that takes an unsigned integer and returns the number of ’1' bits it has (also known as the Hamming weight). For example, the 32-bit integer ’11' has binary representation 00000000000000000000000000001011, so the function should

大数阶乘的位数和精确值计算【转】

来源:http://www.cnblogs.com/stonehat/p/3603267.html 在此,顶礼膜拜一下原文作者呵呵 我们知道整数n的位数的计算方法为:log10(n)+1 故n!的位数为log10(n!)+1 如果要求出n!的具体值,对很大的n(例如n=1000000)来说,计算会很慢,如果仅仅是求阶乘的位数,可以用斯特林(Stirling)公式求解 斯特林(Stirling)公式: 于是求n!的位数就是求log10((2*PI*n)^1/2*(n/e)^n)+1 即 1/2*l

求一个整数的位数

C++ 吧里看到有人求助, 说是想写点代码求一个整数的位数, 以下是我的解决方法: int32_t RecursionIter (const int64_t& num, const int32_t& result) { if (num < 0) { return RecursionIter (-num, result); } else if (num / 10 == 0) { return result; } else { return RecursionIter (num / 10

while循环操作,输入一个整数放入到变量n中, 如果这个整数大于0,那么计算1+2+3+……+n的结果, 否则输出“输入的数据有错误”。

import java.util.Scanner; /** * @author 蓝色以太 while循环操作,输入一个整数放入到变量n中, 如果这个整数大于0,那么计算1+2+3+--+n的结果, * 否则输出"输入的数据有错误". */ public class While2 { public static void main(String[] args) { Scanner sc = new Scanner(System.in); System.out.println("

OC--有这么一个 整数 123456789,如何将这个整数的每一位数,从末位开始依次放入数组中,并遍历 倒序输出字符串

有这么一个 整数 123456789,如何将这个整数的每一位数,从末位开始依次放入数组中,并遍历 1 NSInteger num=123456789; 2 NSString *str=[[NSString alloc]initWithFormat:@"%ld",num ]; 3 NSMutableArray *arr=[NSMutableArray array]; 4 for(NSInteger i=str.length-1;i>=0;i--){ 5 //从末位开始截取字符串,每