當前位置:編程學習大全網 - 源碼下載 - 1*2*3*4***n n個連續自然數相乘求積 有什麽解決方法?

1*2*3*4***n n個連續自然數相乘求積 有什麽解決方法?

由於階乘運算的增長速度特別快(比2^n的增長速度快),對於較小整數的階乘運算采用簡單的遞規算法可以實現,但是對於大整數的乘法(比如1000!),則傳統的遞規算法就失去了作用。

由於本人的水平不高,用下列拙劣的方式實現,請高人多多指教。具體如下:定義壹個很長的數組,用數組的每壹項表示計算結果的每壹位。例如,7!=5040,a[1000],則a[0]=0,a[1]=4,a[2]=0,a[3]=5。

程序源代碼:

/**

*計算大數的階乘,算法的主要思想就是將計算結果的每壹位用數組的壹位來表示:如要計算5!,那麽首先將

*(1) a[0]=1,然後a[0]=a[0]*2,a[0]=2,

*(2) a[0]=a[0]*3,a[0]=6

*(3) a[0]=a[0]*4,a[0]=24,此時a[1]=2,a[0]=4

*/

public class Factorial

{

static int a[] = new int [10000];

static void factorial(int n)

{

for(int i=2; i< a.length; i++)

a[i] = 0; //將數組元素初始化

a[0] = 1; //用數組的壹項存放計算結果的位數

a[1] = 1; //將第壹項賦值為壹

for(int j= 2; j <= n; j++)

{

int i=1;

int c = 0; //c表示向高位的進位

for(; i <= a[0]; i++)

{

a[i] = a[i] * j + c;//將來自低位的計算結果和本位的結果相加

c = a[i] / 10;

a[i] = a[i] % 10;

}

for(; c != 0; i++)

{

a[i] = c%10;

c = c / 10;

}

a[0] = i - 1;

}

}

public static void main(String[] args)

{

String num = args[0];

int count = 0;

int n = Integer.parseInt(num);

f(n);

for(int i= a[0]; i>0; i--)

{

count++;

System.out.print(/*"a[" + i + "]=" + */a[i]/* + " "*/);

}

System.out.println("\n"+count);

}

}

  • 上一篇:php循環倒計時的代碼
  • 下一篇:主力如何建倉?
  • copyright 2024編程學習大全網