mal wieder Primzahlen



  • 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 :).


Anmelden zum Antworten