谁帮解释这个阶乘速算法的原理?
谁帮解释这个阶乘速算法的原理?
一种Javascript写法:
function jc(N) {
var data = new Array(100);
var num = 0; // 占用的个数
data[0] = 1; // 0和1的阶乘是1
for(var i=1;i <data.length;i++){
data[i]=0;
}
for (var i = 2; i <= N; i++) {
for (var j = 0; j < num + 1; j++) {
data[j] *= i; // 对每个int中的数都乘上 i
}
for (var j = 0; j < num + 1; j++) {
if (data[j] > 1000000) {
for (var k = j; k < num + 1; k++) {
if (data[num] > 1000000) num++;
data[k+1] += Math.floor(data[k]/1000000); // 进位
data[k] %= 1000000; // 进位后的余数
}
}
}
}
T1.value=( "计算 " + N + "的阶乘\n ");
T1.value+=( "占用的int数: " + (num+1) + "\n值:\n ");
T1.value+=(data[num]);
for (var i = num-1; i > -1; i--) {
T1.value+=((1000000+data[i]).toString().substr(1));
}
}
另一种Javascript写法:
function multiN(n) //连乘n!
{
var r = [1];
for(var i = 2; i <= n; i++)
{
for(var j = 0, c = 0; j < r.length || c != 0; j++)
{
var v = j < r.length ? r[j] * i + c : c;
r[j] = v % 10000000000;
c = (v - r[j]) / 10000000000;
}
}
for(var i = 0; i < r.length - 1; i++)
{
if(r[i] < 10) {r[i] = '000000000 ' + r[i]; continue;}
if(r[i] < 100) {r[i] = '00000000 ' + r[i]; continue;}
if(r[i] < 1000) {r[i] = '0000000 ' + r[i]; continue;}
if(r[i] < 10000) {r[i] = '000000 ' + r[i]; continue;}
if(r[i] < 100000) {r[i] = '00000 ' + r[i]; continue;}
if(r[i] < 1000000) {r[i] = '0000 ' + r[i]; continue;}
if(r[i] < 10000000) {r[i] = '000 ' + r[i]; continue;}
if(r[i] < 100000000) {r[i] = '00 ' + r[i]; continue;}
if(r[i] < 1000000000) {r[i] = '0 ' + r[i]; continue;}
}
//document.writeln(r.length+ ': ');
//document.writeln(r.join( ', '));
return r.reverse().join( " ");
}
另一种Java写法:
public static void main(String[] args) {
int[] data = new int[100];
int num = 0; // 占用的个数
data[0] = 1; // 0和1的阶乘是1
for (int i = 2; i < 257; i++) {
for (int j = 0; j < num + 1; j++) {
data[j] *= i; // 对每个int中的数都乘上 i
}
for (int j = 0; j < num + 1; j++) {
if (data[j] > 1000000) {
for (int k = j; k < num + 1; k++) {
if (data[num] > 1000000) num++;
data[k+1] += data[k]/1000000; // 进位
data[k] %= 1000000; // 进位后的余数
}
}
}
}
System.out.println( "占用的int数: " + (num+1) + "\n值: ");
System.out.print(data[num]);
for (int i = num-1; i > -1; i--) {
System.out.print(new java.text.DecimalFormat( "000000 ").format(data[i]));
}
}
[解决办法]
像这样类似的代码很多,代码虽不同,算法还是相通的。可看看我的blog,内有大数阶乘的算法和代码。
[解决办法]
话说这几个都很低效,怎么就是速算法了呢?
大整数用一个数组表示。
第一个和第三个就是模拟竖式乘法,第二个似异实同,没什么特别的算法。