This is a companion discussion topic for the original entry at https://toph.co/p/big-factorials

This is a companion discussion topic for the original entry at https://toph.co/p/big-factorials

The problem statement is inconsistent Why would it allow `24`

instead of `0024`

? Clearly the problem wanted last 4 digits! And even if it allows `24`

, why would it only accept `0000`

and not `0`

?

Please update the statement asap!

@shantanu404 This is an interesting discovery.

The statement has been updated, but what you described reveals an interesting quirk in our code that compares outputs. We will have to tinker with it a little.

Thank you!

Thanks! You guys are quick!

```
#include<stdio.h>
int main()
{
unsigned long long b, N, factorial=1, i;
scanf("%llu", &N);
for(i=N; i>1; i--) {
factorial = factorial * i;
}
b=factorial%10000;
if(b == 0) {
printf("0000\n");
}
else if(factorial >=9999 && b<=999) {
printf("%04llu\n", b);
}
else {
printf("%llu\n", b);
}
return 0;
}
```

whatâ€™s the problemâ€¦??? help me to find the bugâ€¦

@rased_299 The problem is in this line:

```
factorial = factorial * i;
```

What happens if N is large enough to cause `factorial`

to overflow.

```
#include <stdio.h>
#include<math.h>
int main() {
int N,i,b=0;
long long int fact=1,a=0;
scanf("%d",&N);
for(i=1;i<=N;i++){
fact=fact*i;
}
for(i=0;i<4;i++)
{
a=fact%10;
b=b+a*pow(10,i);
fact=fact/10;
}
printf("%lld",b);
return 0;
}
```

```
#include <stdio.h>
int main()
{
int a,b,c=1;
scanf("%d",&a);
for(b=1;b<=a;b++){
c=c*b;
}
printf("%d",c);
return 0;
}
```

problem???

You have to print only last four digit.

how can i do that ???

`c = c % 10000;`

this will give you last four digit.

```
#include <stdio.h>
int main()
{
int a,b,c=1,d;
scanf("%d",&a);
for(b=1;b<=a;b++){
c=c*b;
}
d=c%10000;
printf("%d",d);
return 0;
}
```

wrong for test 3. Why??

Well you see that factorial of letâ€™s say 100! which is really big the variable `c`

canâ€™t contain this big integer so it will give wrong values.To avoid this you can write `c = (c * b) % 10000`

in the loop, so it will always be four digit integer.

@SonicTitan03

YOu have to feel the factorial closely to solve this problem.

Try to calculate higher values of factorial and check out what their trailing digits become.

```
#include <stdio.h>
int main()
{
int n, a;
long long int fact = 1;
scanf("%d", &n);
for(a = n; a >= 2; a--) {
fact = fact * a;
}
printf("%lld", fact%10000);
return 0;
}
```

WHAT IS THE PROBLEM IN THIS CODE.

IT IS SHOWING WRONG ANSWER IN TEST CASE 4

See what @touhidur said above your post. Always go through existing posts to see if you can get any clue. Often you will find that whatever question you have has already been asked by someone else and answered.

if the num>19 what i will print?because

leading is 0 not allowed

//um passing time with the chili sauce

#include<bits/stdc++.h>

using namespace std;

#define io_fast() ios :: sync_with_stdio(false); cin.tie(0);

#define go return 0

#define ll long long int

#define ull unsigned long long int

#define ld long double

#define vi vector

#define vl vector

#define vc vector

#define vs vector

#define vp vector< pair<ll,ll> >

#define sl set

#define sc set

#define pi 3.14159265358979

int fact(int n){

if(n > 1)

return n * fact(n - 1);

else

return 1;

}

int main()

{

io_fast();

ll n,m;

cin>>n;

if(n>19) cout<<0000<<"\n";

else if(n==15) cout<<8000<<"\n";

else {

m=fact(n);

m=m%10000;

cout<<m<<"\n";

}

go;

}

whats the pb?

```
if(n>19) cout<<0000<<"\n";
^^^^
```

I think this will only print 0 there, not 0000.