Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <stdio.h>
- #include <stdlib.h>
- #include <stdbool.h>
- typedef struct d_array {
- int *arr;
- size_t size, used;
- } d_array;
- void free_arr(d_array *a){
- free(a->arr);
- a->used = a->size = 0;
- }
- bool resize_arr(d_array *a){
- a->size *= 2;
- int *pt = a->arr;
- a->arr = realloc(a->arr, a->size * sizeof(int));
- if(!a->arr) {
- free(pt);
- return false;
- }
- return true;
- }
- bool init_arr(d_array *a, size_t init_size){
- a->arr = malloc(init_size * sizeof(int));
- if(!a->arr) return false;
- a->used = 0;
- a->size = init_size;
- return true;
- }
- bool push(d_array *a, int key){
- if(a->used == a->size) if(!resize_arr(a)) return false;
- a->arr[a->used++] = key;
- return true;
- }
- #define base 10
- void printBigInt(d_array *a) {
- for (int i = a->used - 1; i >= 0; i--) {
- printf("%d", a->arr[i]);
- }
- }
- bool mulBigInt(d_array *a, int m) {
- for (int j = 0; j < a->used; j++)
- a->arr[j] *= m;
- for (int j = 0; j < a->used - 1; j++)
- if (a->arr[j] >= base) {
- a->arr[j+1] += a->arr[j] / base;
- a->arr[j] %= base;
- }
- while (a->arr[a->used - 1] >= base) {
- if (!push(a, a->arr[a->used - 1] / base))
- return false;
- a->arr[a->used - 2] %= base;
- }
- return true;
- }
- int main() {
- d_array arr;
- if (init_arr(&arr, 16)) {
- push(&arr, 1);
- int n;
- scanf("%d", &n);
- for (int i = 2; i <= n; i++) {
- if (!mulBigInt(&arr, i)) exit(EXIT_FAILURE);
- }
- printBigInt(&arr);
- putchar('\n');
- free_arr(&arr);
- exit(EXIT_SUCCESS);
- }
- else {
- exit(EXIT_FAILURE);
- }
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement