/[cvs]/joko/Uni/BSArch/01/prime.c
ViewVC logotype

Contents of /joko/Uni/BSArch/01/prime.c

Parent Directory Parent Directory | Revision Log Revision Log


Revision 1.7 - (show annotations)
Fri May 12 23:27:11 2006 UTC (18 years, 4 months ago) by joko
Branch: MAIN
Changes since 1.6: +22 -15 lines
File MIME type: text/plain
+ use strtol instead of atoi for error detection
+ what about 9999999999 (ten 9s)? respect number of chars for max int range

1 /* $Id: prime.c,v 1.6 2006/05/12 21:13:49 joko Exp $ */
2
3 #include <stdio.h>
4 #include <stdlib.h>
5 #include <limits.h>
6
7 #define BOOL int
8 #define TRUE 1
9 #define FALSE 0
10
11 #define PRINTPRIME(x) if (is_prime(x)) printf("%i\n", x)
12 #define PRINTERROR(message) fprintf(stderr, "ERROR: %s\n", message)
13
14 /* check for prime number */
15 BOOL is_prime(long int number)
16 {
17 int i;
18
19 /* negative values are never prime numbers */
20 if (number < 2) return FALSE;
21
22 /* check all numbers 2..sqrt(number) for being a prime number */
23 for (i=2; i*i <= number; i++) {
24 if ((number % i) == 0)
25 return FALSE;
26 }
27 return TRUE;
28 }
29
30 /* convert from string to long int, with error checking */
31 long int convert_number(const char *nptr) {
32 long int number = strtol(nptr, (char **)NULL, 10);
33 if (number == LONG_MAX || number == LONG_MIN) {
34 char message[254];
35 snprintf(message, 255, "Number is not in range of 'long int': %s", nptr);
36 PRINTERROR(message);
37 exit(-1);
38 }
39 }
40
41 int main(int argc, char * argv[])
42 {
43
44 if (argc == 1) {
45 PRINTERROR("No arguments given.");
46 exit(-1);
47 }
48
49 /* (3) range mode */
50 if (argc > 2) {
51 long int i, j;
52 j = convert_number(argv[2]);
53 for (i = convert_number(argv[1]); i< j; i++) {
54 PRINTPRIME(i);
55 }
56
57 /* other modes */
58 } else {
59
60 /* try to open file for reading */
61 FILE * fp = fopen(argv[1], "r");
62
63 /* (1) test-single-number mode: first argument is not a filename */
64 if (fp == NULL) {
65 long int number = convert_number(argv[1]);
66 PRINTPRIME(number);
67
68 /* (2) file mode: read numbers from file */
69 } else {
70 char entry[11];
71 while (fgets(entry, 11, fp)) {
72 long int number = convert_number(entry);
73 PRINTPRIME(number);
74 }
75 fclose(fp);
76 }
77 }
78 }

MailToCvsAdmin">MailToCvsAdmin
ViewVC Help
Powered by ViewVC 1.1.26 RSS 2.0 feed