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

一、精确计算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     scanf("%d", &n);
12     memset(f, 0, sizeof(f));
13     f[0] = 1;
14     for (i = 2; i <= n; i++) {
15         int c = 0;
16         for (j = 0; j < maxn; j++) {
17             int s = f[j] * i + c;
18             f[j] = s % 10;
19             c = s / 10;
20         }
21     }
22     for (j = maxn-1; j >= 0; j--) if (f[j]) break;
23     printf("total bits:%d\n", j+1);
24     for (i = j; i >= 0; i--) printf("%d", f[i]);
25     printf("\n");
26
27     return 0;
28 }

如果你不想像第16行一样,遍历数组里的每一位来做乘法,那么可以加上一个跟踪参数validBits来设置循环的阈值。这个参数初始化为1,当j达到validBits-1而且进位不为零的时候,validBits自增1。

如果现在要我们计算10000000!的阶乘,怎么办?刚才我们用计算器计算1000的阶乘,可以得到一个科学表示法的结果。当我们计算10000的阶乘时,Windows的计算器提示“溢出”。

那么我们现在简化问题,先计算10000000的阶乘有多少位有效数字。

二、计算阶乘的位数

先给出一个结论:有一个正整数n,则它的位数为log10(n) + 1。

解释如下:

对于正整数n,我们有10^(x-1) <= n < 10^x,其中x为正整数。则我们可以指出n的位数为x。

对不等式取对数:log10(10^(x-1)) <= log10(n) < log10(10^x),简化得到:x-1 <= log10(n) < x。

则我们有log10(n) + 1 >= x,且log10(n) < x,

则对log10(n)取整之后,我们有(int)log10(n) + 1 = x。

现在我们要求n!的位数,则相当于求(int)log10(n!) + 1。

而log10(n!)=log10(n) + log10(n-1) + log10(n-2) + ... + log10(1)

我们很容易编程解决这个问题。

 1 #include <stdio.h>
 2 #include <math.h>
 3
 4 int
 5 main(int argc, char** argv)
 6 {
 7     double result;
 8     int input;
 9     int j;
10
11     result = 0;
12     scanf("%d", &input);
13
14     for (j = 1; j <= input; j++) {
15         result += log10(j);
16     }
17
18     printf("%d\n", (int)result + 1);
19
20     return 0;
21 }

运行程序,输入10000000,输出结果为65657060。

所以10000000的阶乘的结果有65657060位数字。

时间: 2024-10-13 23:53:34

阶乘的计算以及大数的表示的相关文章

计算一个大数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

蓝桥杯 BASIC 30 阶乘计算(大数)

[思路]:大数基本都是这思路,采用数组或者字符串,每个数采用倒序的方式从头开始存储.每次进位进到下一位上. [AC代码]:两个数组来回颠倒. #include <iostream> #include <algorithm> #include <cstdio> #include <cstring> #include <cmath> #include <iomanip> using namespace std; #define MAX 3

java中四种阶乘的计算

package com.zf.s2;//创建一个包 import java.math.BigInteger;//导入类 import java.util.ArrayList; import java.util.List; public class TextFactorial {//操作计算阶乘的类     public static int simpleCircle(int num){//简单的循环计算的阶乘         int sum=1;         if(num<0){//判断传入

精度计算-大数乘大数

精度计算                     大数乘大数 本算法是用来计算一个大数(现有的数据类型无法表示的数)乘以一个大数(现有的数据类型无法表示的数). 算法思路是把大数的每一位都当做一个字符放入一个字符数组中,再把乘数的各个位与被乘数的各个位从最高位依次相乘,将结果存放在一个二维数组res中.例如计算12*12,res[0][0] = 1,res[0][1] = 2,res[1][0] = 2,res[1][1] = 4,那么最终结果的数组s,s[0] = res[0][0]= 1,s

精度计算-大数加大数

精度计算                大数加大数 本算法是用来计算一个大数(现有的数据类型无法表示的数)加上一个大数(现有的数据类型无法表示的数). 算法思路是把作为被加数和加数的大数的每一位都当做一个字符分别放入一个字符数组中,再把加数的各个位与被加数的各个位从最低位依次相加,将结果存放在一个字符指针中,最后再放入一个结果数组中. 下面是我的C语言实现过程 #include<stdio.h> #include<string.h> void add(char a[],char b

精度计算-大数乘小数

精度计算-大数乘小数 本算法是用来计算一个大数(现有的数据类型无法表示的数)乘以一个小数(10以内的数). 算法思路是把大数的每一位都当做一个字符放入一个字符数组中,再从最后一位开始于要乘的小数相乘并加上前一位的进位,如果有进位存入一个变量中,加到下一位的计算中去. 下面是我的C语言实现过程. int main() { char c[100] = "1231231231231231231231231231231232"; char t[101] ; int m = 10; mult(c

大数算法

大数阶乘算法 原文链接 大数阶乘算法 前几天朋友问我一个问题:"10000的阶乘怎么算?"当时我就有点懵,"10000"这个数字太大了,无论用什么数据类型保存结果都会溢出.这可怎么办呢?一时间束手无策.然后被一顿鄙视.后来经朋友的提醒,才恍然大悟,终于知道怎么实现了,原来是使用数组来模拟数字,这样无论结果数字有多大,只要数组的长度够长就能表示出来,用这个办法可以进行大数据的运算.看起来还是挺有用的.我把它用程序实现出来,如果有用到的地方还可以借鉴一下.(最起码还可以

python小代码之阶乘求和

需求: 阶乘:也是数学里的一种术语:阶乘指从1乘以2乘以3乘以4一直乘到所要求的数:在表达阶乘时,就使用"!"来表示.如h阶乘,就表示为h!:阶乘一般很难计算,因为积都很大. 提问:求1+2!+3!+...+20!的和 实现环境:python3 编辑器:pycharm 分析:1.阶乘的计算就是比较麻烦的一部分,用递归函数实现是比较好的方案,先定义一个递归函数实现求阶乘功能. def  recursion(n):    '定义递归函数实现求阶乘功能' if n==1:     retur