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

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

Parent Directory Parent Directory | Revision Log Revision Log | View Patch Patch

revision 1.3 by joko, Fri May 12 19:03:04 2006 UTC revision 1.7 by joko, Fri May 12 23:27:11 2006 UTC
# Line 1  Line 1 
1    /* $Id$ */
2    
3  #include <stdio.h>  #include <stdio.h>
4  #define PRINTPRIME(x) if(prime(x)) printf("%i\n", x)  #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  int prime(int number)  /* check for prime number */
15    BOOL is_prime(long int number)
16  {  {
17    int i;          int i;
18    for(i=2;i*i<=number;i++){          
19          if((number%i) == 0)          /* negative values are never prime numbers */
20            return 0;          if (number < 2) return FALSE;
21    }          
22    return 1;          /* 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[])  int main(int argc, char * argv[])
42  {  {
43          int i, j;          
44          FILE * fp;          if (argc == 1) {
45          char num[11];                  PRINTERROR("No arguments given.");
46          if(argc > 2 ){                  exit(-1);
47                  j=atoi(argv[2]);          }
48                  for(i=atoi(argv[1]) ; i< j; i++){          
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);                          PRINTPRIME(i);
55                  }                  }
56          }else {          
57                  fp=fopen(argv[1], "r");          /* other modes */
58                  if(fp==NULL){          } else {
59                          PRINTPRIME(atoi(argv[1]));  
60                  }else{                  /* try to open file for reading */
61                          while(fgets(num, 11, fp))                  FILE * fp = fopen(argv[1], "r");
62                                  PRINTPRIME(atoi(num));                  
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);                          fclose(fp);
76                  }                  }
77          }          }

Legend:
Removed from v.1.3  
changed lines
  Added in v.1.7

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