• + 0 comments

    For those of you interested in challenging yourself to write this in C

    #include <math.h>
    #include <stdio.h>
    #include <string.h>
    #include <stdlib.h>
    #include <assert.h>
    #include <limits.h>
    #include <stdbool.h>
    
    int main(){
        int n, length_digit = 1; 
        scanf("%d",&n);
        int *r = malloc(60 * sizeof(int));
        r[0] = 1;
        for (int factor = 2; factor <= n; factor++) {
            int *carry = malloc( (length_digit + 2) * sizeof(int));
            // first, evaluate product
            for (int i = 0; i < length_digit; i++) {
                r[i] *= factor;
                r[i] += carry[i];
                if (r[i] / 100 > 0) {
                    carry[i + 2] += r[i] / 100;
                    carry[i + 1] += (r[i] % 100) / 10;
                    r[i] = r[i] % 10;
                } else if (r[i] / 10 > 0) {
                    carry[i + 1] += r[i] / 10;
                    r[i] = r[i] % 10;
                }
            }
            
            // second, consider if length of digit increases
            if (carry[length_digit + 1] > 0) {
                r[length_digit + 1] = carry[length_digit + 1];
                r[length_digit + 1] += carry[length_digit] / 10;
                r[length_digit] = carry[length_digit] % 10;
                length_digit += 2;
            } else if (carry[length_digit] > 0) {
                r[length_digit] = carry[length_digit];
                length_digit++;
            }
        }
        
        // print
        for(int i = length_digit - 1; i >= 0; i--){
            printf("%d", r[i]);
        }
        
    }