big-factorial
import java.util.Scanner;
/**
* Program to find factorial for n, where 1 <= n <= 100. Solution for codechef.com
*
* @author Amit Kumar (allyamit@gmail.com)
* @since 28-May-2017
*/
public class Main {
// this stores the result limit
private final static int M_INDEX = 199;
public static void main(String[] args) {
try {
Scanner scan = new Scanner(System.in);
Integer times = scan.nextInt();
int inputNumbers[] = new int[100];
for (int i = 0; i < times; i++) {
inputNumbers[i] = scan.nextInt();
}
for (int i = 0; i < times; i++) {
display(factorial(inputNumbers[i]));
System.out.println();
}
scan.close();
} catch (Exception e) {
System.out.println(e.getMessage());
}
}
/** Convert the number into array integer. */
private static int[] convertNumberToArray(int x) {
int[] number = new int[200];
int index = 0;
int lastDigit;
// Store x number into result
while (x > 0) {
lastDigit = x % 10;
number[index] = lastDigit;
x /= 10;
index++;
}
number[M_INDEX] = index;
return number;
}
/** Multiply the BigNumber generated with the second number. */
private static int[] multiply(int[] x, int y) {
int[] result = new int[200];
int singleDigitMultiplyResult;
int carry = 0;
int resultIndex = 0;
int lastDigit;
for (int i = 0; i < x[M_INDEX]; i++) {
singleDigitMultiplyResult = (x[i] * y) + carry;
lastDigit = (singleDigitMultiplyResult) % 10;
carry = singleDigitMultiplyResult / 10;
result[resultIndex] = lastDigit;
resultIndex++;
}
int[] car = convertNumberToArray(carry);
for (int i = 0; i < car[M_INDEX]; i++) {
result[resultIndex] = car[i];
resultIndex++;
}
result[M_INDEX] = resultIndex;
return result;
}
/** Find the factorial */
private static int[] factorial(int n) {
if (n == 1)
return convertNumberToArray(1);
return multiply(factorial(n - 1), n);
}
/** Display the result in the codechef.com format */
private static void display(int[] result) {
for (int i = result[M_INDEX] - 1; i >= 0; i--) {
System.out.print(result[i]);
}
}
}