#include "sieve.h" #include #include #include #include #include #include static void printfac(int64_t num, int64_t *buf) { int64_t n; int i = 0; fprintf(stdout, "%ld = ", num); while ((n = buf[i++]) != 0) { if (i == 1) fprintf(stdout, "%ld", n); else fprintf(stdout, " * %ld", n); } fprintf(stdout, "\n"); } static sieve s; void onTerm(int signal) { sieve_free(&s); exit(1); } int main(int argc, char **argv) { if (argc != 2) { printf("Usage: %s \n", argv[0]); exit(1); } int64_t maxnum = atol(argv[1]); sieve_init(&s, sqrt(maxnum) + 1); // Attach signal handler struct sigaction sa; memset(&sa, 0, sizeof(sa)); sa.sa_handler = onTerm; sigaction(SIGTERM, &sa, NULL); sigaction(SIGINT, &sa, NULL); // Generate sieve fprintf(stderr, "Generating sieve...\n"); sieve_generate(&s); fprintf(stderr, "done\n"); fflush(stderr); int64_t buf[1024]; // Main loop char line[1024]; while (1) { // Read line int i = 0; int c; while ((c = getchar()) != EOF) { if (c == '\n') break; if (i < sizeof(buf) - 3) line[i++] = c; } line[i++] = 0; int64_t num = atol(line); if (num > maxnum) { printf("Number too big. Max size: %ld.\n", maxnum); } else if (num <= 0) { printf("Can only factor numbers >= 0.\n"); } else { // Factor sieve_factor(&s, num, buf); // Print printfac(num, buf); } fflush(stdout); if (c == EOF) return 0; } sieve_free(&s); return 0; }