// Source file: prime.c // Purpose: generate prime numbers and test if prime // Authors: Scott Wenger & Mark Wenger, 1997 // Box 802 // Stevens Point, WI 54481 // panther@wctc.net // // Notes: will compile under DOS; the body of code should // also compile under UNIX #include #include #include #include #define MAX 200000000 // two hundred million // function prototypes void finished(long amount); void list_primes(void); void pcls(void); int prime(long number); int prime_numbers(long amount); void single_test(void); int pause = 0; // flag //-------------------------------------------------------------------- main() { int ch; int valid; pcls(); fprintf(stderr, "\n PRIME Number program by Scott Wenger & Mark Wenger"); fprintf(stderr, "\n --------------------------------------------------\n\n"); valid = 0; while (!valid) { fprintf(stderr, "\n --------------- M E N U ------------ \n"); fprintf(stderr, "\n 1. Show a list of prime numbers."); fprintf(stderr, "\n 2. Test a single number to see if prime."); fprintf(stderr, "\n 3. Quit this program.\n"); fprintf(stderr, "\n Choose 1, 2, or 3 above [ ]\b\b"); ch = getch(); switch(ch) { case '1' : list_primes(); break; case '2' : single_test(); break; case '3' : pcls(); exit(0); default : break; } // end of switch } // end of while } //-------------------------------------------------------------------- void list_primes(void) { long amount; int valid; int ch; pcls(); fprintf(stderr, "\n\nHow many prime numbers do you want to see? "); scanf("%ld", &amount); if (amount > 20L) { fprintf(stderr, "\nPause after each screen of prime numbers? (y/n) [ ]\b\b"); valid = 0; while (!valid) { ch = getch(); if (ch == 'y' || ch == 'Y') { pause = 1; valid = 1; } if (ch == 'n' || ch == 'N') { valid = 1; } } // end of while printf("\n"); } // end of outer if prime_numbers(amount); } //-------------------------------------------------------------------- void single_test(void) { long test; int valid = 0; int p_number = 0; pcls(); while (!valid) { fprintf(stderr, "\nNumber to test: "); scanf("%ld", &test); if (test > 0 && test <= MAX) valid = 1; if (test < 1 || test > MAX) { fprintf(stderr, "\nNumber to test must be in range of 1 to %ld\n", MAX); } } p_number = prime(test); if (p_number) fprintf(stderr, "\n%ld is a prime number. ", test); if (!p_number) fprintf(stderr, "\n%ld is NOT a prime number.", test); fprintf(stderr, "\n\nPress any key to continue [ ]\b\b"); getch(); pcls(); } //-------------------------------------------------------------------- int prime(long number) { long i; int not_prime = 0; if (number == 1L || number == 2L || number == 3L) return(1); // prime for (i = 2L; i < number - 1L; i++) { if (number % i == 0L) { not_prime = 1; break; } if (not_prime == 0) { if (i * i > number) break; } } // end of for loop if (not_prime == 0) return(1); // a prime number else return(0); // not prime } //-------------------------------------------------------------------- // pcls is a primitive clear screen (yet highly portable) void pcls(void) { register int x; for (x = 0; x < 40; x++) printf("\n"); } //-------------------------------------------------------------------- int prime_numbers(long amount) { long counter = 0L; int done = 0; int lcount = 0; // line counter int ch; long i; long number = 1; int not_prime = 0; // a flag // show the first 3 prime numbers "manually" for (i = 0; i < 3; i++) { printf(" %16ld\n", number); // a prime number counter++; if (amount == counter) { finished(amount); return(1); } number++; } // print the rest of the prime numbers here while (!done) { number++; for (i = 2L; i < number - 1L; i++) { if (number % i == 0) { not_prime = 1; break; } if (not_prime == 0) { if (i * i > number) { break; } } } if (not_prime == 0) { printf(" %16ld\n", number); // a prime number counter++; if (counter == amount) { finished(amount); return(1); } if (pause) { lcount++; if (lcount == 20) { fprintf(stderr, "\nPress space bar to continue or 'q' to quit."); ch = getch(); if (ch == 'q' || ch == 'Q') { pcls(); exit(0); } else { lcount = 0; pcls(); } } } // end of outer if } not_prime = 0; // reset flag } // end of outer while loop return(0); } // end of prime_numbers function //-------------------------------------------------------------------- void finished(long amount) { fprintf(stderr, "\n\nDone. Displayed %ld prime numbers.", amount); fprintf(stderr, "\nPress any key to return to menu [ ]\b\b"); getch(); pcls(); } //--------------------------------------------------------------------