C/C++写高精度计算建议直接用现成的库。
比如GNU MP,完全开源,编译安装过程官网也写的很明白。
代码这么写(C语言版本):
#include <stdio.h> #include <gmp.h> int main() { mpz_t result; mpz_init_set_ui(result, 1); for (int i = 1; i <= 1000; i++) { mpz_mul_ui(result, result, i); } gmp_printf("%Zd
", result); mpz_clear(result); return 0; }
这段代码在我这里只需要0.057毫秒。根据您的水平不同,使用现成的库的性能很可能比您手写的算法高2000倍到2倍不等。并且能帮您节省数十分钟到数十小时的开发调试优化时间。
您刚入门C语言,如果您的志向不在算法研究之类的数学专业上,自己造个大数类的轮子什么的基本完全没意义,现成的开源库性能好不知道多少倍为啥不用呢?
哦对了,这种东西不建议百度算法,百度上你看到的大概率是慢200倍+的。
这个我也想过,想不出来,于是到网上找了找大佬们的解答,找到一个比较容易接受的算法。
我们小时候要算两个数的积时,应该都会列竖式算的吧?(大佬请忽略)这个算法的原理就是用数组去表示积的每一位数,用一个变量表示进位,比如72要用两个元素的数组表示,784要用三个元素的数组表示。
不多赘述了,直接看代码。
//函数功能:打印非负整数的阶乘值 void Print_Factorial ( const int N ){ int num = 0; int a[20000] = {1}; //令数组第一个元素为1 int max = 1; //当前结果的最大位数 int temp; if(N < 0) { printf("Invalid input"); //负数直接返回 return; } else{ for(int i = 2; i <= N; i++) //外层循环控制阶乘阶数 { num = 0; for(int j = 0; j < max; j++) { temp = a[j] * i + num; a[j] = temp % 10; //计算结果结果个位,十位,百位...上的数 num = temp / 10; //num如果非零的话会累计到下一位 } while(num) //判断num是否非零,决定是否要增加位数max { a[max] = num % 10; num = num / 10; max++; } } for(int i = max - 1; i >= 0; i--) //逆序输出数组元素 { printf("%d", a[i]); } } return; }
再解释一下,如果N小于2的话,不会进入循环,直接输出1。而N大于2时,第一次循环时,a[0] = 2,第二次循环a[0] = 6,第三次a[0] = 24,超过10了,需要进位,那么此时a[0]等于24的个位数即4,而十位数2被num保留,因此进入while循环,给位数max加1,代表当前有了两位数......如此往复,理论上只要给扩大数组,有足够时间和内存,就可以算任何数的阶乘了,1000当然不在话下。
结果如下
没说要求精确值吧?用long double类型,斯特林公式就行了吧……
本站所有内容均为互联网搜索引擎提供的公开搜索信息,本站不存储任何数据与内容,任何内容与数据均与本站无关,如有需要请联系相关搜索引擎包括但不限于百度,google,bing,sogou 等
© 2025 tinynews.org All Rights Reserved. 百科问答小站 版权所有