Was würdet ihr bei diesem C99 Code anders machen, kann man noch etwas optimieren



  • C Anfänger schrieb:

    PS:

    Natürlich hätte ich auch ein Progamm schreiben können, daß die ersten 10000 Primzahlen auch einfach durch Berechnung findet, aber ich will den Code weiternutzen und brauche daher absolut zuverlässige Zahlen die schon richtig sind.

    Also mir wäre da ein Stück Code, das ich nicht mehr verändere, zum Beispiel zur Sicherheit in eine Datei auslagere, sicherer, als eine Datendatei auf der Platte. Und jetzt, wo Kommas, Leerzeichen und Zeilenunmbrüche in der Datei passieren, wird das ja viel konmplizierter, als Primzahlen auszurechnen.

    #include <stdio.h>
    #include <stdlib.h>
    
    int hasdiv(int cnd,int* lst)
    {
    	while (*lst)
    		if (cnd%*lst++==0)
    			return 1;
    	return 0;
    }
    
    int* genprmlst(int cnt)
    {
    	int prmcnt=0,*lst=malloc(cnt*sizeof(int)+1),cnd=2;
    	lst[0]=0;
    	while (prmcnt<cnt)
    	{
    		while (hasdiv(cnd,lst))
    			++cnd;
    		lst[prmcnt++]=cnd;
    		lst[prmcnt]=0;
    	}
    	return lst;
    }
    
    int main()
    {
    	int *primzahlen=genprmlst(25);
    
    	/* Listet alle eingelesenen Primzahlen auf */
    	int primecounter = 0;
    	do
    	{
    		printf("%i, %i\n", primecounter, primzahlen[primecounter]);
    		primecounter++;
    	} while (primzahlen[primecounter] != 0);
    
    	free(primzahlen);
    	return 0;
    }
    

    Edit: Damit man den Code viel schneller lesen kann, habe ich nach alter C-Tradition in den Bezeichnern ein paar Vokale entfernt. Entgegen der Tradition habe ich bedeutungstragende Wörter nicht unter drei Buchstaben fallen lassen, wie man bei prmcnt gut sieht, das dürfte klassisch nicht länger als pcnt oder prmc sein. Ich hoffe, die Traditionalisten können mir verzeihen.



  • Jetzt klappts auch mit mehreren Werten pro Zeile:

    C Anfänger schrieb:

    #include <stdio.h>
    #include <string.h>
    #include <ctype.h>
    #include <stdlib.h>

    #define DATEINAME "primzahlen.txt"
    #define ANZAHL_PRIMZAHLEN 10000

    main()
    {
        FILE *fp;
        int primzahlen[ANZAHL_PRIMZAHLEN], zaehler=0, primecounter;
        char zeile[200], *t;
    
        /* Lese Primzahlen aus Datei und speichere sie in Primzahlen Array */
        fp = fopen(DATEINAME, "rt");
        if(fp != NULL)
        {
          while( fgets(zeile,sizeof zeile,fp) )
            for(t=strtok(zeile,",");t;t=strtok(0,","))
              if( 1==sscanf(t,"%d",&primzahlen[zaehler]) )
                ++zaehler;
          fclose(fp);
        }
        else
            perror(DATEINAME);  
    
        /* Listet alle eingelesenen Primzahlen auf */
        primecounter = 0;
        while( primecounter<zaehler )
        {
            printf("%d, %d\n", primecounter+1, primzahlen[primecounter]);
            primecounter++;
        }
        return 0;
    }
    

Anmelden zum Antworten