c++ - Can anyone explain this algorithm for calculating large factorials? -


I have come to the following program to calculate the large factorials (greater than 100). Somebody can tell me the basic idea Is used in this algorithm ?? I need to know the fact that in fact mathematical calculations have been done.

  #include & lt; Cmath & gt; # Include & lt; Iostream & gt; # Include & lt; Cstdlib & gt; using namespace std; Int main () {unsigned int d; Unsigned char * a; Unsigned int j, n, q, z, t; Int I, ARR [101], F; Double P; CIN & gt; & Gt; N; P = 0.0; For (j = 2; j; l; = n; j ++) p + = log 10 (j); D = (int) p + 1; A = new unsigned char [D]; For (i = 1; i & lt; d; i ++) a [i] = 0; // start [0] = 1; P = 0.0; For (j = 2; j; l; = n; j ++) {q = 0; P + = Log 10 (J); Z = (int) P + 1; For (i = 0; i & lt; = z / * NUMDIGITS * /; i ++) {T = (a [i] * j) + q; Q = (T / 10); A [i] = (four) (t% 10); }} For (I = D -1; I> = 0; I -) COAT & LT; & Lt; (Integer) a [i]; The court's & lt; & Lt; "\ N"; Delete [] A; Return 0; }  

Note that

  n! = 2 * 3 * ... * n  

so

  log (n!) = Log (2 * 3 * ... * n) = Log (2) + log (3) + ... + log (n)  

This is important because if k is a positive integer The maximum limit of log (s) is in the representation of base code 10 in k . Thus, these lines of code n! Calculating the number of digits in .

  p = 0.0; For (j = 2; j; l; = n; j ++) p + = log 10 (j); D = (int) p + 1;  

Then, these lines of code n! Allocate space to hold digits of

  a = new unsigned char [d]; For (i = 1; i & lt; d; i ++) a [i] = 0; // initialize  

Then we just do grade-grade multiplication algorithm

  p = 0.0; For (j = 2; j; l; = n; j ++) {q = 0; P + = Log 10 (J); Z = (int) P + 1; For (i = 0; i & lt; = z / * NUMDIGITS * /; i ++) {t = (a [i] * j) + q; Q = (T / 10); A [i] = (four) (t% 10); }}  

External loop j to 2 to n because we are currently in each step The code will be indicated by a to j . The internal loop is the grade-school multiplication algorithm in which we multiply each digit by j and if it is necessary, take the result in q .

P = 0.0 Before the nested loop and in the p + = log10 (j) loop, just keep track of the number of digits in the reply so far .

Incidentally, I think there is a bug in this part of the program. Loop status i & lt; Z not i Change the code>

  for (i = 0; i & lt; = z / * NUMDIGITS * /; i ++) by  

 For  (i = 0; i & lt; z / * NUMDIGITS * /; i ++)  

Then we print digits only For

  (I = D -1; I> = 0; I -) COAT & LT; & Lt; (Integer) a [i]; The court's & lt; & Lt; "\ N";  

and free allocated memory

  delete [A] A;  

Comments

Popular posts from this blog

oracle - The fastest way to check if some records in a database table? -

php - multilevel menu with multilevel array -

jQuery UI: Datepicker month format -