mal wieder Primzahlen



  • hey 🙂

    ich habe zwar die Suchfunktion benutzt und auch Google durchwühlt aber nichts gefunden, was mein Problem löst:

    Ich bin im 1. Semester der Angewandten Informatik und wir haben als Aufgabe bekommen, ein programm zu schreiben, was alle Primzahlen ausgibt, die unter der Eingabe des Programmnutzers liegen.
    So weit kein problem...

    Ich habe folgenden Code (zur Berechnung der Primzahlen) geschrieben:

    int prim(int number)
    {	
    	if (number<2) 
    	{
                return 0;
            }
            else 
    	{
    		if (number==2) 
    		{
    			return 1;
    		}
    		else 
    		{
    			for(int counter=2;counter<=number;++counter)
    			{
    				if((number%counter)==1)
    				{
    					return 1;
    				}
    				else
    				{
    					return 0;
    				}
    			}
    		}
    	}
    }
    

    (es wird die Eingabe des Nutzers an die prim-Funktion übergeben)
    Danach (wieder in der main-fkt) folgt nur noch die Ausgabe, etc

    jetzt besteht folgendes Problem:
    Mir ist aufgefallen, dass des Prog auch z.B. bei der 15 (was ich nachvollziehen kann) oder bei der 77 (!!!) 0 ausgibt...

    jedenfalls weiß ich dass weder 15 noch 77 ne Primzahl ist (und ich geh davon aus dass es bei höheren Werten wieder vorkommen wird)

    durch die Primzahlen kann ich (meines wissens nach) nicht dividieren, weil ich dem array ja nen ebst. wert zuweisen muss...(dyn. Variablen haben wir noch nicht) und wenn die eingabe des nutzers über der größe liegt isses auch doof...

    weiß nicht mehr weiter...
    help?! 😉

    thx


  • Mod

    Du gibst ja schon 0 zurück, sobald du im ersten Durchlauf feststellst, dass die Zahl nicht durch 2 teilbar ist.



  • Müsste das denn nicht so aussehen??

    int prim(int number)
    {   
        if (number<2)
        {
                return 0;
            }
            else
        {
            if (number==2)
            {
                return 1;
            }
            else
            {
                for(int counter=2;counter<=number;++counter)
                {
                    if((number%counter) == 0)
                    {
                        return 0;
                    }
                }
                return 1;
            }
        }
    }
    


  • (dyn. Variablen haben wir noch nicht)

    Was sollen eigentlich dynamische Variablen sein?



  • linux_c89 schrieb:

    (dyn. Variablen haben wir noch nicht)

    Was sollen eigentlich dynamische Variablen sein?

    .

    Er meint sicher Speicherplatz für Daten der vom Heap kommt (per malloc oder Ähnlichem).



  • möglich dass es die erklärung von DirkB ist 😉
    unser Dozent sagt halt immer nur Dynamische Variablen...

    @isam2k:
    oh ja na klar...eigetnlich wars auch so aber vermutlich hatte ich bevor ichs kopiert hatte nochmal dran rumgewurschtelt...sry
    So weit funktioniert mein Code ja...
    es ist ja nur, dass er (bis 100)
    die 15 und die 77 ausgibt, was theoretisch nicht sein dürfte...

    @SeppJ
    hätte sich ja dann geklärt 🙂 danke trotzdem...

    also das hier ist mein vollständiger code:

    #include <stdio.h>
    
    int prim(int number)
    {	
    	if (number<2) 
    	{
                return 0;
            }
            else 
    	{
    		if (number==2) 
    		{
    			return 1;
    		}
    		else 
    		{
    			for(int counter=2;counter<=number;++counter)
    			{
    				if((number%counter)==0)
    				{
    					return 0;
    				}
    				else
    				{
    					return 1;
    				}
    			}
    		}
    	}
    }
    
    int main(void)	
    {	
    	int input,new,new2;	
    	printf("größte Zahl eingeben ");
    	scanf("%d",&input);
    	new=15%5;
    	printf("Modulo 15 5 %d\n",new);
    	new2=77%7;
    	printf("Modulo 77 7 %d\n",new2);
    
    	while(input>0)
    	{
    
    	if(prim(input)==1)
    	printf("%d\n",input);	
    
    	input-=1;
    	}
    
    	return 0;	
    }
    

    wie gesagt...das problem liegt eigentlich nur an der 15 und 77 (wahrscheinlich gibts noch weitaus mehr in den höheren bereichen)



  • achja: dass dort das mit dem

    new=15%5;
    printf("Modulo 15 5 %d\n",new);
    new2=77%7;
    printf("Modulo 77 7 %d\n",new2);
    

    ist überflüssig - war nur für mich damit ich sehe was das im Modulo ergibt...
    und da wird ausgegeben:
    Modulo 15 5 0 und
    Modulo 77 7 0 (warum auch immer)



  • Spiel doch mal Deine for-Schleife von Hand durch. Entweder im Debugger oder mit Papier und Bleistift. Zum Beispiel anhand der 9. Die erkennt Dein Code nämlich auch fälschlicherweise als Primzahl. Vielleicht merkst Du ja schon beim Debuggen / Aufschreiben, wo was falsch läuft.



  • Primzahlen von 1 bis 100 und noch weitere

    2
    3
    5
    7
    9    ??
    11
    13
    15   ??
    17
    19
    21   ??
    23
    25   ??
    27   ??
    29
    31
    33   ??
    35   ??
    37
    39   ??
    41
    43
    45   ??
    47
    49   ??
    51   ??
    53
    55   ??
    57   ??
    59
    61
    63   ??
    65   ??
    67
    69   ??
    71
    73
    75   ??
    77   ??
    79
    81   ??
    83
    85   ??
    87   ??
    89
    91   ??
    93   ??
    95   ??
    97
    99
    

    In den letzten Wochen wurden viele Beispielcodes zum Thema Primzahlen gepostet. Nutze doch die Forensuche und vergleiche diese Codes mit deinem.

    Edit: Tipp: Das return 1; steht an der falschen Stelle.

    Edit2: ⚠ Du zählst zu weit! ⚠



  • wars dir zu anstrengend den code von isam2k mit deinem zu vergleichen?



  • @Vorposter:
    nein war es nicht und ich habs mehrmals gelesen...
    ich hatte bloß übrsehen dass der else-zweig fehlt...

    @SG1/ViciousFalcon
    argh...stimmt...es gibt ja noch mehrere nicht primzahlen bei denen ich nicht gemerkt habe dass sie dabei stehen...damn it...
    bins schon öfter im kopf durchgegangen aber ist wahrscheinlich wirklich mal notwendig das schritt für schritt aufzuschreiben bzw nen Debugger herunterzuladen...

    Danke schonmal für die hilfreichen Tips 😉
    👍 👍 👍



  • im übrigen würde Isam2k's Version auch nicht funktionieren...
    (tut sie auch cniht - hatte es schon probiert)

    und zwar weil man sich in diesem Teil

    else
    {
         for(int counter=2;counter<=number;++counter)
         {
            if((number%counter) == 0)
            {
               return 0;
            }
         }
         return 1;
    }
    

    das Zählen sparen könnte - dieser else-Zweig gibt ja immer 1 zurück



  • Vicious Falcon schrieb:

    Edit2: ⚠ Du zählst zu weit! ⚠

    Wie ist eine Primzahl definiert? Sie ist nur durch eins und sich selbst teilbar!
    Was gibt bspw. 37%37 zurück? Und wie reagierst du dann darauf?



  • Vicious Falcon schrieb:

    Wie ist eine Primzahl definiert? Sie ist nur durch eins und sich selbst teilbar!

    Nö. Eine Primzahl ist eine natürliche Zahl, welche durch genau zwei natürliche Zahlen teilbar ist.



  • Ja, gut, sie ist nur durch eins und sich selbst teilbar, wobei dies zwei verschiedene Zahlen sein müssen 🙄



  • wie ne primzahl definiert ist wusste ich noch 🙂
    hatte aber einen denkfehler was die Modulo-Funktion angeht...
    (ich dachte z.B. dass bei 77%7 77/7=11/7= ... und das hat da ja keinen sinn gemacht)

    hab mich dahingehend nochmal informiert und ich weiß es jetzt besser 🙂

    und:
    dank eurer Tips (SG1/ViciousFalcon) hab ich den Fehler gefunden und behoben 😃
    wenn ich das nächste mal nicht weiter komme werde ich gleich alles schriftlich durchgehen und nicht nur "durchdenken" 😛
    und das mit dem zu weit zählen ist mir dabei auch aufgefallen 🙂

    jetzt funktionierts einwandfrei...

    #include <stdio.h>
    
    int prim(int number)
    {	
    	int retval;                      //retval=returnvalue			
    	if (number<2)			
    	{
                retval=0;
            }
            else 
    	{
    		if (number==2) 		
    		{
    			retval=1;
    		}
    		else 
    		{
    			for(int counter=2;counter<number;++counter)	
    			{
    				if((number%counter)==0)
    				{
    					retval=0;
    					break;
    				}
    				else
    				{
    					retval=1;
    				}
    			}
    		}
    	}
    	return retval;
    }
    

    Also nochmal danke an alle, die sich die Zeit hierfür genommen haben
    👍 👍 👍



  • Vicious Falcon schrieb:

    Ja, gut, sie ist nur durch eins und sich selbst teilbar, wobei dies zwei verschiedene Zahlen sein müssen 🙄

    Ist vielleicht ein bisschen kleinlich, aber mein utopisches Ziel ist es, dass sich ne richtige Definition durchsetzt, damit man nicht jeder neuen Generation erklären muss, warum 1 keine Primzahl ist 🙂



  • Michael E. schrieb:

    Ist vielleicht ein bisschen kleinlich, aber mein utopisches Ziel ist es, dass sich ne richtige Definition durchsetzt, damit man nicht jeder neuen Generation erklären muss, warum 1 keine Primzahl ist 🙂

    Ja, okay, im Grunde isses ja richtig :).


Log in to reply