博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
阶乘的计算以及大数的表示
阅读量:5930 次
发布时间:2019-06-19

本文共 1802 字,大约阅读时间需要 6 分钟。

一、精确计算1000!的阶乘

1000!有多大呢?拿微软自带的计算器一算,结果是4.02*10^2567,共有2568位。

在C语言中我们没有能够精确表示这个数字的数据类型。

如果非要计算,那么只能以数组的形式存放每一位数字。

代码不太难,如下:

1 #include 
2 #include
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 
2 #include
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位数字。

 

转载于:https://www.cnblogs.com/nipan/p/4116685.html

你可能感兴趣的文章
iOS RSA加密 以及生成公钥 秘钥 pem文件
查看>>
SRS配置HLS分发
查看>>
redis-哨兵模式
查看>>
spring注入为null的问题
查看>>
破解网页禁用鼠标右键方法
查看>>
[leetcode] 3Sum Closest
查看>>
Android微信扫描二维码登入实现 基于ZXing开源工程
查看>>
tvOS游戏开发系列(SpriteKit)之新建tvOS游戏项目(二)
查看>>
golang 扫雷
查看>>
shell指令总结
查看>>
Dell XPS 15 9560 Linux mint
查看>>
QQ登录网站接入
查看>>
PHP 方法覆盖override 与 抽象方法的实现之间的关系
查看>>
Git远程操作详解
查看>>
file_get_contents 超时处理
查看>>
源代码解读Spring只读事务与读写事务的性能的差别
查看>>
solr自定义分词
查看>>
Linux:査看文件的详细信息
查看>>
微信小程序
查看>>
ThinkPHP视频学习教程,thinkcmf基础入门-the lesson 1
查看>>