计算一个大数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=1000000  输出5565709

#include <string>
#include <iostream>
#include <iomanip>
#include <stdio.h>
#include <cmath>

using namespace std;

int main()
{
    long int n;
    long int i;
    double sum;

    while(scanf("%ld", &n)!=EOF)
    {
        sum=0.0;
        for(i=2; i<=n; i++)
        {
            sum+=log10(i);
        }
        printf("%ld\n", (int)sum+1 );
    }
    return 0;
}
时间: 2024-10-21 01:08:04

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

计算一个大数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)的阶乘的位数

对于一个正整数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)

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

来源: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

阶乘的计算以及大数的表示

一.精确计算1000!的阶乘 1000!有多大呢?拿微软自带的计算器一算,结果是4.02*10^2567,共有2568位. 在C语言中我们没有能够精确表示这个数字的数据类型. 如果非要计算,那么只能以数组的形式存放每一位数字. 代码不太难,如下: 1 #include <stdio.h> 2 #include <string.h> 3 4 #define maxn 3000 5 6 int f[maxn]; 7 8 int main() 9 { 10 int i, j, n; 11

计算一个正整数的阶乘(JavaScript)

function factorial(n) { if (isFinite(n) && n > 0 && n == Math.round(n)) { // 有限的正整数 if (!(n in factorial)) // 没有缓存结果 factorial[n] = n * factorial(n - 1); return factorial[n]; // 返回缓存结果 } else { return NaN; } } factorial[1] = 1; factoria

一个大数的好东西

#include<stdio.h>//不能连续复合运算,要保存结果 #include<stdlib.h>//所以一个技巧就是用strcpy来代替等号 #include<string.h>//c=a+b改写为strcpy(c,BigAdd(a,b)) #include <iostream> using namespace std; #define BASE 10 //确定进制 #define N 90001 //确定 最大位数+1 int l = 0; //每

神秘常量!用0x077CB531计算末尾0的个数,32位数首位相连

大家或许还记得 Quake III 里面的一段有如天书般的代码,其中用到的神秘常量 0x5F3759DF 究竟是怎么一回事,着实让不少人伤透了脑筋.今天,我见到了一段同样诡异的代码.     下面这个位运算小技巧可以迅速给出一个数的二进制表达中末尾有多少个 0 .比如, 123 456 的二进制表达是 1 11100010 01000000 ,因此这个程序给出的结果就是 6 . unsigned int v;  // find the number of trailing zeros in 32

【翻译自mos文章】怎么正确的计算一个ip地址的subnet id?

怎么正确的计算一个ip地址的subnet id? 来源于: How to calculate the correct subnet for an interface (文档 ID 1059759.1) 适用于: Oracle Database - Enterprise Edition - Version 10.2.0.1 and later Information in this document applies to any platform. 目标: 正确的计算一个ip地址的subnet i

【Java】使用switch 计算一个日期是当年的第几天

计算一个日期是当年的第几天 这是去年做的一个Java题目,老师当时说这段代码里的switch用的很好. 现在工作一年了,明显感觉当时还很稚嫩,那个时候考虑问题很简单, 现在遇到问题会想更多的方面,说到这里,真的要谢谢带我的经理, 这段时间真的学到很多东西,每天都是在解决问题,每天都能学到新东西, 短短几个月时间进步了好多. 1 import java.util.Scanner; 2 3 /** 4 * 计算一个日期是当年的第几天 5 */ 6 public class CountDays { 7