#include #include "numbers.h" /* Reads a number with up to SIZE many digits. * Stores the number modulo 2*10^{SIZE} with least * significant digit first. Returns error if number * has more than SIZE digits. */ int read_number(Number number) { char symbol; /* Stores current input symbol */ Number temp; /* temporary storage for numbers */ int size; /* stores the number of digits in input */ temp = allocate_space(); symbol = skip_blanks(); /* Read the first non-white space symbol */ if (symbol == '-') { /* negative number */ number[SIZE] = 1; symbol = getchar(); /* read the first digit */ } else /* positive number */ number[SIZE] = 0; for (size = 0; 1; size++) { if ((symbol < '0') || (symbol > '9')) /* not a digit */ break; if (size == SIZE) { /* input too large */ printf("Input too large: number should be at most %d digits\n", SIZE); return 0; } temp[size] = symbol - '0'; symbol = getchar(); /* read next symbol */ } /* Store number in reverse order ,leaving the sign in place */ int i; for (i = 0; i < size; i++) number[i] = temp[size-1-i]; for (i = size; i < SIZE; i++) number[i] = 0; /* Convert to modular representation */ number2modular(number); free_space(temp); return 1; } /* end of read_number() */ /* Output the given number. It first converts the number * from its representation modulo 2*10^{SIZE} to normal. */ void output_number(Number number) { int i; Number temp; temp = allocate_space(); /* Transfer the number to temp */ copy_number(temp, number); /* Convert it to normal representation */ number2modular(temp); /* Skip the leading zeroes */ for (i = SIZE-1; i >= 0; i--) if (temp[i] > 0) break; if (i == -1) { /* the sum is zero! */ printf("0\n"); return; } if (temp[SIZE] == 1) /* negative number */ putchar('-'); for (; i >= 0; i--) putchar(temp[i]+'0'); printf("\n"); free_space(temp); } /* Skips white spaces in the input and returns the first * non-white space symbol. The white spaces are defined to * be BLANK, NEW LINE, and TAB symbols. */ char skip_blanks() { char c; c = getchar(); for (; (c == ' ') || (c == '\n') || (c == '\t'); ) c = getchar(); return c; } /* Set the number to the value n */ void set_number(Number number, int n) { int i; if (n < 0) { // negative number n = -n; // make it positive number[SIZE] = 1; // Set the sign of number to negative } else // n is positive number[SIZE] = 0; // set the sign of number to positive for (i = 0; i < SIZE; i++) { number[i] = n % 10; // store the last digit of n n = n / 10; // remove the last digit of n } // Now change the number to modular representation number2modular(number); } /* Copies the number num2 to num1 */ void copy_number(Number num1, Number num2) { for (int i = 0; i <= SIZE; i++) num1[i] = num2[i]; }