Einrückungsproblem?

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Antworten
Bykl
User
Beiträge: 92
Registriert: Donnerstag 5. Oktober 2017, 17:57

Zu bestimmten Stellen springt mein Code nicht in das 2. If. Darum bleibt in der Variablen bruch2 der Wert aus der Vorschleife.


Beispieldruck - Fehler in 2. Zeile. Dadurch werden die in der 2. Zeile die ...
x+1 529 i 7 bru1 75 x 484 bru2 70 Dfbr 5 pzgez 2 Anzahl: 2 75 70 Exmp [71, 73] 75 70
x+1 529 i 11 bru1 48 x 484 bru2 44 Dfbr 4 pzgez -2 Anzahl: -4 48 70 Exmp [] 48 70 hier müste 44 stehen statt der 70
x+1 529 i 13 bru1 40 x 484 bru2 38 Dfbr 2 pzgez -2 Anzahl: 0 40 38 Exmp [] 40 38
x+1 529 i 17 bru1 31 x 484 bru2 29 Dfbr 2 pzgez 0 Anzahl: 2 32 28 Exmp [29, 31] 32 28
x+1 529 i 19 bru1 27 x 484 bru2 26 Dfbr 1 pzgez 0 Anzahl: 0 27 26 Exmp [] 27 26
x+1 529 i 19 bru1 27 x 484 bru2 26 Dfbr 1 pzgez! 0 27 26 Anzahl: 0 Exmp 27 26 []

A. Was kann das sein?
B. Was ist zu tun?


Code: Alles auswählen

for i in sieve.primerange (7,x):        
        bruch1 = int((math.pow(x+1,2))/i)#obere Intervallgrenze - höhere Zahl 961/7 - jetzt selbe Zahl
        lbruch1=bruch1
        if isprime(bruch1) == True: #Anpassung an Pythons Rechenmodus
            prrob=bruch1+1
            pprob=bruch1+1
        else:
            prrob=bruch1
            pprob=bruch1
        if (x*x)%(i)==0:       #hier beginnt der Fehler
            bruch2 = int((math.pow(x,2))/i)#untere Intervallgrenze - kleinere Zahl 900 / 8 - jetzt selbe Zahl
            lbruch2=bruch2
          
        else:       
            bruch2 = int(((math.pow(x,2))/i)+1) #untere Intervallgrenze wegen Nachkommateil um eins erhöht
            lbruch2= int((math.pow(x,2))/i)
            if isprime(bruch2) == True:
                pprun=(bruch2-1)
                prrun=bruch2-1
            else:
                pprun=bruch2
                prrun=bruch2
        
Bykl
User
Beiträge: 92
Registriert: Donnerstag 5. Oktober 2017, 17:57

wo kann man sich einloggen, um zu löschen? Denn das Problem ist gelöst!
Benutzeravatar
__blackjack__
User
Beiträge: 13003
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

@Bykl: Lass das mit den Vergleichen mit literalen Wahrheitswerten mal sein. Nach ``if`` muss ein Ausdruck stehen der im Wahrheitskontext `True` oder `False` ergibt. Die `isprime()`-Funktion liefert doch schon `True` oder `False`. Das vergleichst Du dann mit ``== True`` was wieder `True` ergibt wenn `isprime()` schon `True` geliefert hat und `False` wenn `isprime()` schon `False` geliefert hat. Das ist also so überflüssig wie an irgendeine Rechnung immer ``+ 0`` oder ``* 1`` dran zu hängen.

Und falls man das Gegenteil prüfen möchte von dem was ein Ausdruck liefert, dann nimmt man ``not`` dafür und nicht ``== False`` oder ``!= True``.
“Most people find the concept of programming obvious, but the doing impossible.” — Alan J. Perlis
Sirius3
User
Beiträge: 17710
Registriert: Sonntag 21. Oktober 2012, 17:20

@Bykl: vermeide Abkürzungen. Bis ich herausgefunden habe, dass prrob irgendein prr_oben ist, hat es eine Weile gedauert, was dass prr von einem ppr unterscheiden, ist mir aber noch völlig unklar. Was ist der unterschied zwischen einem bruch und einem lbruch?

Vermeide math.pow. Um Potenzen zu berechnen gibt es **, das bei Ganzzahlen nicht auf Floatingpoint zurückgreift, ebenso // statt / für Ganzzahldivision. Zudem werden viele Berechnungen mehrfach gemacht, wenn man sie durch einfache Umstellung nur einmal machen müßte:

Code: Alles auswählen

   for i in sieve.primerange (7,x):        
        bruch1 = lbruch1 = (x + 1) ** 2 // i
        prr_oben = ppr_oben = bruch1 + isprime(bruch1)
        lburch2, rest = divmod(x ** 2, i)
        if rest == 0:
            bruch2 = lbruch2
        else:       
            bruch2 = lbruch2 + 1
            prr_unten = ppr_unten = bruch2 - isprime(bruch2)
wobei ich ja glaube, dass die letzte Zeile falsch eingerückt ist. Und warum sind so viele Variablen doppelt? Die Dopplung sollte man erst machen, wenn man tatsächlich den beiden unterschiedliche Werte zuweist.
Antworten