c program to calculate factorial of large numbers

Discussion in 'C' started by teacher, Mar 27, 2011.

1. teacherNew Member

Joined:
Mar 27, 2011
Messages:
66
8
Trophy Points:
0
Occupation:
i hate jobs
Location:
india,agra
This is my solution to calculate the factorial of large numbers upto 3300 and can be extended depending on your system memory.To increase range change constant ARRAY_SIZE:pleased::pleased:

Code: cpp
Code:
```#include <stdio.h>
#include <math.h>
/* INCREASE OR DECREASE ARRAY_SIZE TO INCREASE OR DECREASE THE
*  RANGE OF NUMBERS WHOSE FACTORIAL YOU WANT TO CALCULATE
*  TESTED ON DEV C++
*  AUTHOR: TEACHER
*/
#define ARRAY_SIZE 12000
int fact(int a[],int number,int *f){
int i,carry=0,temp;
for(i=ARRAY_SIZE-1;i>=(*f);--i){
temp=(a[i])*(number)+carry;
a[i]=temp%10;
carry=(temp/10);
}
while(carry){
a[i]=carry%10;
carry=carry/10;
i--;
}
*f=i+1;
}
int main(){
int i=ARRAY_SIZE-1,f=ARRAY_SIZE-1,n,x;
static int a[ARRAY_SIZE];
printf("enter number to calculate its  factorial: ");
scanf("%d",&x);
if(x==0){
printf("1");
}
else{
int temp=x;
while(temp){
a[i]=temp%10;
temp=temp/10;
i--;
}
f=i+1;
for(i=x-1;i>=1;--i){
fact(a,i,&f);
}
for(i=f;i<=ARRAY_SIZE-1;++i){
printf("%d",a[i]);
}
printf("\n");
}
}
```

2. kyleNew Member

Joined:
Dec 28, 2010
Messages:
46
0
Trophy Points:
0
Occupation:
don't have 1
Location:
i live in Italy,Milano
thank you man
i could really use that

3. kyleNew Member

Joined:
Dec 28, 2010
Messages:
46
0
Trophy Points:
0
Occupation:
don't have 1
Location:
i live in Italy,Milano
thank you man
i could really use that

4. teacherNew Member

Joined:
Mar 27, 2011
Messages:
66
8
Trophy Points:
0
Occupation:
i hate jobs
Location:
india,agra
hey buddy are you really getting the logic behind this or just copy paste.?dont,t do copy paste to get numbers.these numbers are not worth anything...

5. kyleNew Member

Joined:
Dec 28, 2010
Messages:
46
0
Trophy Points:
0
Occupation:
don't have 1
Location:
i live in Italy,Milano
i am trying to learn C++,but to be honest , don't understand a line there.
that's not good at all (wish i could know C++)
and i hate copying, i really do, even in real life.

6. teacherNew Member

Joined:
Mar 27, 2011
Messages:
66
8
Trophy Points:
0
Occupation:
i hate jobs
Location:
india,agra
That's not a good sign .do you know c ?
you must learn c before learning c++ ,actually above code is in c not in c++....
can you differentiate between c and c++ ? srry but i think you can't

7. elviragNew Member

Joined:
May 3, 2011
Messages:
2
0
Trophy Points:
0
Code:
```#include <stdio.h>
#include <math.h>

#define N 2568

//AUTHOR: elvirag@gmail.com :)

//play with the N to enlarge the length of the answer...
//more on the program outside of it...
//PLUS explanations about the numbers in the example.

int i,j,k,sum=0,fact=0;
int a[N]={0};

int main() {

a[0]=1;
printf("What factorial do you want to calculate? ");
scanf("%d",&fact);

for(i=2;i<=fact;i++){
for(j=0;j<N;j++) a[j]*=i;
for(k=0;k<N;k++){
if(a[k]>9){
a[k+1]+=a[k]/10;
a[k]=fmod(a[k],10);
}
if(a[k+1]>9){
a[k+2]+=a[k+1]/10;
a[k+1]=fmod(a[k+1],10);
}
}
}
for (i=0;i<N;i++) {
printf("%d",a[i]);
}
printf("\n");
printf("Read the number from right to left!");
return 0;
}

```
This code runs the factorial of 10,000, which has 35660 DIGITS(!)
in the whooping time of 22.218 seconds, on my laptop which is a 4 year old HP.

There is actually no limit whatsoever to what factorial you can calculate with this code, as long as you add to N the required length.

I advise that if you start seeing zeroes at the end, you should make your N smaller.
It will take less time.

A standard and not a scary example of the power of this code:
10! - N=7, 3.14 secs...
100! - N=158, 1.906 secs...
1000! - N=2568, 2.671 secs...

As you can see, it's more powerful as the facts go up...

Have fun.

And sorry for the over enthusiasm, it's the first time I publish code online...:shy:

8. teacherNew Member

Joined:
Mar 27, 2011
Messages:
66
8
Trophy Points:
0
Occupation:
i hate jobs
Location:
india,agra
sorry if i am being rude but the code you have posted is less practical to be used in real life problems

first of all to print out the correct value of a factorial you must know the number of digits in the result in advance so that you can set the value of N

for eg

if N=3
5!=021

if N=4

tell me how the user will be able to know the number of digits in the result ?

for eg if user wants to calculate 1331! ,from where he will get the value of N?

again your code is printing the digits in a result in reverse order.that is also not cool if you want to use that result in another calculation.

at last you said that your code is taking 22 secs to calculate 10000!.sorry if i am biased towards my code but my code is still taking less time ((my code ) 8 secs on my machine vs (your code) 20 secs on my machine ) to calculate 10000!.

correct me if i am wrong

thank you

9. elviragNew Member

Joined:
May 3, 2011
Messages:
2
0
Trophy Points:
0
Well, you can surely use it in another calculation, because the array is still there,
it doesn't just print out the result and dissipates.

Besides, I didn't say that my code was superior,
I just said that it is more easily understandable to people who
are not on a high level, which I myself wasn't the time I published the code.

Now I am, but I can still relate to people who read your code and say
"huh? I don't understand where it all goes..." cause that is what I felt.
And when I ran your code (and I did, ofc) the results were quite similar.
But the point is not the speed because it gives the result.

And regarding the "if N=4
No, the answer it will give if N=4 is: 0210
which is correct if you read it from the right to the left.

You are not supposed to KNOW the N, you print the result,
then if you have zeroes at the beginning of the number,
you make the N smaller, but you don't really have to.
If you don't see zeroes,
there is a risk that it's not all of the answer so you make the N bigger.

I hope I was able to answer all of your questions,since this is my first time publishing code,
I was never this excited about programming.

10. teacherNew Member

Joined:
Mar 27, 2011
Messages:
66
8
Trophy Points:
0
Occupation:
i hate jobs
Location:
india,agra