#include <stdio.h>
#define MAX_DIGITS 200 // Enough space for 50!
// Multiplies the big number (stored in result as digits in reverse order)
// by the given factor. The current size of the number is pointed to by result_size.
void multiply(int factor, int result[], int *result_size) {
int carry = 0;
for (int i = 0; i < *result_size; i++) {
int prod = result[i] * factor + carry;
result[i] = prod % 10;
carry = prod / 10;
}
while (carry) {
result[*result_size] = carry % 10;
carry /= 10;
(*result_size)++;
}
}
// Computes factorial(n) using an iterative approach.
void factorial(int n) {
// The big number is stored in an array, with the least-significant digit at index 0.
int result[MAX_DIGITS] = {0};
int result_size = 1;
result[0] = 1; // Initialize with 1
for (int i = 2; i <= n; i++) {
multiply(i, result, &result_size);
}
// Print the big number in the correct order (most-significant digit first)
for (int i = result_size - 1; i >= 0; i--) {
}
}
int main(void) {
factorial(50);
return 0;
}
I2luY2x1ZGUgPHN0ZGlvLmg+CgojZGVmaW5lIE1BWF9ESUdJVFMgMjAwICAvLyBFbm91Z2ggc3BhY2UgZm9yIDUwIQoKLy8gTXVsdGlwbGllcyB0aGUgYmlnIG51bWJlciAoc3RvcmVkIGluIHJlc3VsdCBhcyBkaWdpdHMgaW4gcmV2ZXJzZSBvcmRlcikKLy8gYnkgdGhlIGdpdmVuIGZhY3Rvci4gVGhlIGN1cnJlbnQgc2l6ZSBvZiB0aGUgbnVtYmVyIGlzIHBvaW50ZWQgdG8gYnkgcmVzdWx0X3NpemUuCnZvaWQgbXVsdGlwbHkoaW50IGZhY3RvciwgaW50IHJlc3VsdFtdLCBpbnQgKnJlc3VsdF9zaXplKSB7CiAgICBpbnQgY2FycnkgPSAwOwogICAgZm9yIChpbnQgaSA9IDA7IGkgPCAqcmVzdWx0X3NpemU7IGkrKykgewogICAgICAgIGludCBwcm9kID0gcmVzdWx0W2ldICogZmFjdG9yICsgY2Fycnk7CiAgICAgICAgcmVzdWx0W2ldID0gcHJvZCAlIDEwOwogICAgICAgIGNhcnJ5ID0gcHJvZCAvIDEwOwogICAgfQogICAgd2hpbGUgKGNhcnJ5KSB7CiAgICAgICAgcmVzdWx0WypyZXN1bHRfc2l6ZV0gPSBjYXJyeSAlIDEwOwogICAgICAgIGNhcnJ5IC89IDEwOwogICAgICAgICgqcmVzdWx0X3NpemUpKys7CiAgICB9Cn0KCi8vIENvbXB1dGVzIGZhY3RvcmlhbChuKSB1c2luZyBhbiBpdGVyYXRpdmUgYXBwcm9hY2guCnZvaWQgZmFjdG9yaWFsKGludCBuKSB7CiAgICAvLyBUaGUgYmlnIG51bWJlciBpcyBzdG9yZWQgaW4gYW4gYXJyYXksIHdpdGggdGhlIGxlYXN0LXNpZ25pZmljYW50IGRpZ2l0IGF0IGluZGV4IDAuCiAgICBpbnQgcmVzdWx0W01BWF9ESUdJVFNdID0gezB9OwogICAgaW50IHJlc3VsdF9zaXplID0gMTsKICAgIHJlc3VsdFswXSA9IDE7IC8vIEluaXRpYWxpemUgd2l0aCAxCgogICAgZm9yIChpbnQgaSA9IDI7IGkgPD0gbjsgaSsrKSB7CiAgICAgICAgbXVsdGlwbHkoaSwgcmVzdWx0LCAmcmVzdWx0X3NpemUpOwogICAgfQoKICAgIC8vIFByaW50IHRoZSBiaWcgbnVtYmVyIGluIHRoZSBjb3JyZWN0IG9yZGVyIChtb3N0LXNpZ25pZmljYW50IGRpZ2l0IGZpcnN0KQogICAgZm9yIChpbnQgaSA9IHJlc3VsdF9zaXplIC0gMTsgaSA+PSAwOyBpLS0pIHsKICAgICAgICBwcmludGYoIiVkIiwgcmVzdWx0W2ldKTsKICAgIH0KICAgIHByaW50ZigiXG4iKTsKfQoKaW50IG1haW4odm9pZCkgewogICAgZmFjdG9yaWFsKDUwKTsKICAgIHJldHVybiAwOwp9Cg==