弱弱的!```请教哈!````关于天文数组的问题?`` 比如要计算一个很大的数!比如说100000的阶乘`改怎么解决!``谢谢各位!` 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 你上www.google.com搜索"高精度乘法"在里边找找都可以找到的,软件名称HugeCalc.exe和Factorial.exe,AutomorphicNumber.exe,PrimeNumber.exe它们的用途不同,Factorial.exe是用来算阶乘的,确实有那么快,不过是用标准c++编出来的,具体算法当然是保密的了,只知道是用了STL技术。我也明白楼上的意思,具体的算法不得而知。 2004.05.08 Ver2.0.1.1 ⊙ 充分运用数论知识优化算法 ⊙ 改进了(双)阶乘、排列、组合等算法,速度提高 25% 左右 ⊙ Factorial.exe 可选是否需输出到窗口(因为“写屏”太费时间) ⊙ 新增软件 PrimeNumber.exe,可生成不大于指定自然数的所有素数2004.04.27 Ver1.2.0.1 ⊙ 优化了乘法群组运算算法 ⊙ 改进了开任意次方的算法 ⊙ 改进了(双)阶乘的算法 ⊙ Factorial.exe 进行格式化输出 ⊙ Factorial.exe 可将结果保存成文件 ⊙ 不再发布 UNICODE 版的 HugeCalc2004.04.08 Ver1.1.0.1 ⊙ HugeCalc.dll 导出函数新增到 169 个 ⊙ 改进了乘法算法2004.03.29 Ver1.0.1.1 ⊙ HugeCalc.dll 导出函数达到 97 个 ⊙ 新增配套软件 HugeCalc.exe,虽然仅使用了部分功能,但已很强大 ⊙ 不再提供自由的 Demo&Test 源代码2004.03.15 ⊙ 新增软件 Factorial.exe,可快速计算(双)阶乘,可独立运行2004.03.02 Ver1.0.0.1 ⊙ 发布该算法库 HugeCalc.dll 雏形 ⊙ 同时提供 Demo&Test 源代码(含 UNICODE 版)这是一套绿色免安装免费软件:Ver2.0.1.1⊙ AutomorphicNumber 自守数问题,1s 内破“世界纪录”。⊙ PrimeNumber 素数生成器,可迅速生成不大于指定自然数的所有素数,并可格式化输出。⊙ Factorial (双)阶乘快速计算器,核心算法源于 HugeCalc,可独立运行于 Win95 以上平台,速度一流(尚未发现比之更快的软件)!⊙ HugeCalc 超大整数高精度快速计算器/算法库(附精心制作的 chm 帮助文档),功能非常强大。最新版下载地址:⊙http://maths.myrice.com/software.htm#02⊙http://www.cccen.com/web/math/software.htm#02⊙http://www.freewebs.com/maths/software.htm#02 用斯特林公式计算吧public class Test { public static void main(String[] args) { stirling(10000); } /** * Stirling: * n! = sqrt(2 * pi * n) * pow(n / e, n) * @param n */ private static void stirling(int n) { double a = n * Math.log10(n / Math.E); double s = 0.5 * Math.log10(2 * Math.PI * n); double base10 = a + s; int exponent = (int)base10; double base = Math.pow(10, base10 - exponent); System.out.println(n + "! = " + base + " * 10^" + exponent); }}100000! = 2.8242270545605797 * 10^456573结果虽然不是很精确,但是位数和头几位是精确的。 采用 log 法可以获得更高的精度,当然了复杂度也由 Stirling 的 O(1) 升为 O(N) 了。 /** * n! = 1 * 2 * 3 * ... * (n - 1) * n * log(n!) = log(1) + log(2) + log(3) + ... + log(n - 1) + log(n) * @param n */ private static void logFactorial(int n) { double sum = 0; for(int i = 1; i <= n; i++) { sum += Math.log10(i); } int exponent = (int)sum; double base = Math.pow(10, sum - exponent); System.out.println(n + "! = " + base + " * 10^" + exponent); }100000! = 2.8242294097488676 * 10^456573 上传答案```#include<iostream>using namespace std;void main(){ int Data[40]; int Digit; int i,j,r,k; int N; for(i=1;i<40-1;i++) Data[i] = 0; Data[0]=1; Data[1]=1; Digit = 1; printf("Enter a number what you want to calculus: "); scanf("%d",&N); for(i=1;i<N+1;i++) { for(j=1;j<Digit+1;j++) Data[j] *= i; for(j=1;j<Digit+1;j++) { if(Data[j]>10) { for(r=1;r<Digit+1;r++) { if(Data[Digit]>10) Digit++; Data[r+1] += Data[r]/10; Data[r] = Data[r]%10; } } } printf("%d! = ",i); for(k=Digit;k>0;k--) printf("%d",Data[k]); printf("\n"); } system("pause");} SWT CTabItem关闭内存没有释放问题 关于java数据库操作的一个问题,求助 windows下,java读写U盘 再请教java的socket使用 如何给文本框(JTextArea)添加滚动条 照书本敲得代码,不懂问题如何解决哦,谢谢各位高手了 明天去国人通信面试,不知公司如何?考什么东东? 急寻sqlserver 7.0 JDBC 驱动?(dongdongshu 请进) 高分求救?SOS 关于用mapinfo xtreme for java做gis的性能问题。 初学JAVE需要什么软件? 正则表达式问题 myeclipse6.5里如何调试,并调试当中如何查看某个变量的值~?
我也明白楼上的意思,具体的算法不得而知。
2004.04.27 Ver1.2.0.1 ⊙ 优化了乘法群组运算算法 ⊙ 改进了开任意次方的算法 ⊙ 改进了(双)阶乘的算法 ⊙ Factorial.exe 进行格式化输出 ⊙ Factorial.exe 可将结果保存成文件 ⊙ 不再发布 UNICODE 版的 HugeCalc
2004.04.08 Ver1.1.0.1 ⊙ HugeCalc.dll 导出函数新增到 169 个 ⊙ 改进了乘法算法
2004.03.29 Ver1.0.1.1 ⊙ HugeCalc.dll 导出函数达到 97 个 ⊙ 新增配套软件 HugeCalc.exe,虽然仅使用了部分功能,但已很强大 ⊙ 不再提供自由的 Demo&Test 源代码
2004.03.15 ⊙ 新增软件 Factorial.exe,可快速计算(双)阶乘,可独立运行
2004.03.02 Ver1.0.0.1 ⊙ 发布该算法库 HugeCalc.dll 雏形 ⊙ 同时提供 Demo&Test 源代码(含 UNICODE 版)
这是一套绿色免安装免费软件:Ver2.0.1.1⊙ AutomorphicNumber 自守数问题,1s 内破“世界纪录”。⊙ PrimeNumber 素数生成器,可迅速生成不大于指定自然数的所有素数,并可格式化输出。⊙ Factorial (双)阶乘快速计算器,核心算法源于 HugeCalc,可独立运行于 Win95 以上平台,速度一流(尚未发现比之更快的软件)!⊙ HugeCalc 超大整数高精度快速计算器/算法库(附精心制作的 chm 帮助文档),功能非常强大。最新版下载地址:⊙http://maths.myrice.com/software.htm#02
⊙http://www.cccen.com/web/math/software.htm#02
⊙http://www.freewebs.com/maths/software.htm#02
stirling(10000);
}
/**
* Stirling:
* n! = sqrt(2 * pi * n) * pow(n / e, n)
* @param n
*/
private static void stirling(int n) {
double a = n * Math.log10(n / Math.E);
double s = 0.5 * Math.log10(2 * Math.PI * n);
double base10 = a + s;
int exponent = (int)base10;
double base = Math.pow(10, base10 - exponent);
System.out.println(n + "! = " + base + " * 10^" + exponent);
}
}100000! = 2.8242270545605797 * 10^456573结果虽然不是很精确,但是位数和头几位是精确的。
* n! = 1 * 2 * 3 * ... * (n - 1) * n
* log(n!) = log(1) + log(2) + log(3) + ... + log(n - 1) + log(n)
* @param n
*/
private static void logFactorial(int n) {
double sum = 0;
for(int i = 1; i <= n; i++) {
sum += Math.log10(i);
}
int exponent = (int)sum;
double base = Math.pow(10, sum - exponent);
System.out.println(n + "! = " + base + " * 10^" + exponent);
}100000! = 2.8242294097488676 * 10^456573
#include<iostream>
using namespace std;
void main()
{
int Data[40];
int Digit;
int i,j,r,k;
int N;
for(i=1;i<40-1;i++)
Data[i] = 0;
Data[0]=1;
Data[1]=1;
Digit = 1;
printf("Enter a number what you want to calculus: ");
scanf("%d",&N);
for(i=1;i<N+1;i++)
{
for(j=1;j<Digit+1;j++)
Data[j] *= i;
for(j=1;j<Digit+1;j++)
{
if(Data[j]>10)
{
for(r=1;r<Digit+1;r++)
{
if(Data[Digit]>10)
Digit++;
Data[r+1] += Data[r]/10;
Data[r] = Data[r]%10;
}
}
}
printf("%d! = ",i);
for(k=Digit;k>0;k--)
printf("%d",Data[k]);
printf("\n");
}
system("pause");
}