Das Vielfache von 3 oder 5 summieren

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
dahvid
User
Beiträge: 7
Registriert: Freitag 30. September 2022, 07:14

Ich möchte alle Zahlen unter 1000, die ein vielfaches von 3 oder 5 sind, summieren. Ich weiß, wie ich alle Zahlen finde, aber nicht, wie man die Summe in Python berechnet.

Code: Alles auswählen

for i in range(1, 1000):

    sum = 0

    if (i % 5 == 0) or i % 3 == 0:
        sum += i

        print(sum) 
Sirius3
User
Beiträge: 18275
Registriert: Sonntag 21. Oktober 2012, 17:20

Um eine Summe zu bilden, muss man mehrere Zahlen addieren. Du setzt aber `sum` immer wieder auf 0 zurück. Das darf man nur einmal vor der Schleife machen.
dahvid
User
Beiträge: 7
Registriert: Freitag 30. September 2022, 07:14

Sirius3 hat geschrieben: Freitag 23. Dezember 2022, 19:26 Um eine Summe zu bilden, muss man mehrere Zahlen addieren. Du setzt aber `sum` immer wieder auf 0 zurück. Das darf man nur einmal vor der Schleife machen.
Vielen Dank. Jetzt hat es funktioniert :)
Benutzeravatar
__blackjack__
User
Beiträge: 14067
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

`sum()` ist der Name einer eingebauten Funktion, den sollte man nicht an einen anderen Wert binden, weil man dann die Funktion nicht mehr verwenden kann, und weil es Leser verwirrt.

Und man könnte die Funktion auch gleich benutzen:

Code: Alles auswählen

In [39]: sum(i for i in range(1000) if i % 5 == 0 or i % 3 == 0)
Out[39]: 233168
“Vir, intelligence has nothing to do with politics!” — Londo Mollari
dahvid
User
Beiträge: 7
Registriert: Freitag 30. September 2022, 07:14

__blackjack__ hat geschrieben: Freitag 23. Dezember 2022, 23:04 `sum()` ist der Name einer eingebauten Funktion, den sollte man nicht an einen anderen Wert binden, weil man dann die Funktion nicht mehr verwenden kann, und weil es Leser verwirrt.

Und man könnte die Funktion auch gleich benutzen:

Code: Alles auswählen

In [39]: sum(i for i in range(1000) if i % 5 == 0 or i % 3 == 0)
Out[39]: 233168
Stimmt, danke für den wertvollen Tipp
bb1898
User
Beiträge: 216
Registriert: Mittwoch 12. Juli 2006, 14:28

Projekt Euler, Problem Nr. 1, richtig? Der Text auf der Projekt-Hauptseite tut ein bisschen so, als müsste man bei allen Aufgaben grundsätzlich den Computer anwerfen. Muss man nicht, in vielen Fällen tun es Bleistift und Papier. Wenn mein Gedächtnis mich nicht täuscht, ist die Nr. 1 mit Schulwissen lösbar. Die bekannte Geschichte dazu spielt auf jeden Fall in einer Schule.
Benutzeravatar
__blackjack__
User
Beiträge: 14067
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

Auf moderner Hardware macht es für den Rechenknecht a.k.a. Computer keinen Unterschied mehr ob man das ”brute force” löst, oder mit der Methode die man mit Stift und Papier verwenden würde, aber auf dem C64 sind das in BASIC 21 Sekunden für die ”brute force”-Variante, immerhin noch 2 Sekunden für einen etwas weniger rechenintensiven Ansatz, und quasi sofort berechnet, wenn man die Papier und Stift Variante wählt.

Code: Alles auswählen

   10 REM -----------------------------
   20 REM PROJECT EULER (PROJECTEULER.NET)
   30 REM
   40 REM PROBLEM 1: FIND THE SUM OF ALL
   50 REM THE MULTIPLES OF 3 OR 5 BELOW
   60 REM 1000.
   70 REM
   80 REM -----------------------------
   90 REM SETUP SOME VALUES FOR (ALMOST)
  100 REM ALL THREE ALGORITHMS.
  110 A=3:B=5:C=999:AB=A*B
  120 REM -----------------------------
  130 REM ASK USER WHICH ALGORITHM TO
  140 REM USE, AND CALL, AND TIME THE
  150 REM CHOSEN ALGORITHM.
  160 REM
  170 POKE 53280,14:POKE 53281,14
  180 PRINT"{BLU}{CLR}{RVS ON}PROJECT EULER - PROBLEM 1{RVS OFF}{DOWN}"
  190 PRINT"FIND THE SUM OF ALL THE MULTIPLES OF 3"
  200 PRINT"OR 5 BELOW 1000.{DOWN}"
  210 PRINT"{LGRN}1{BLU}) NAIVE"
  220 PRINT"{LGRN}2{BLU}) BETTER"
  230 PRINT"{LGRN}3{BLU}) CLOSED FORMULA"
  240 INPUT"{DOWN}CHOOSE ALGORITHM ({LGRN}1{BLU}-{LGRN}3{BLU})";I
  250 PRINT"{DOWN}CALCULATING...{UP}"
  260 REM N IS SET TO 0 BEFORE THE CALL AND
  270 REM THE SUBROUTINE MUST RETURN THE
  280 REM RESULT IN N.
  290 TI$="000000":N=0:ON I GOSUB 400,600,800
  300 PRINT"RESULT ={LGRN}";N;"{BLU}(";RIGHT$(TI$,2);" SECONDS)":END
  400 REM -----------------------------
  410 REM THE NAIVE SOLUTION.  TESTS
  420 REM EVERY NUMBER FROM 1 TO C IF
  430 REM IT IS DIVIDED BY A OR B AND
  440 REM SUMS THEM UP.  TAKES ABOUT
  450 REM 21 SECONDS.
  460 REM
  470 FOR I=1 TO C:IF INT(I/A)*A=I OR INT(I/B)*B=I THEN N=N+I
  480 NEXT:RETURN
  600 REM -----------------------------
  610 REM BETTER ALGORITHM, BUT RUNTIME
  620 REM STILL DEPENDS ON THE VALUE OF
  630 REM C.  SUMS UP ALL MULTIPLES OF A
  640 REM AND B AND THEN SUBRACTS ALL
  650 REM THE NUMBERS THAT ARE DIVIDED
  660 REM BY A *AND* B.  TAKES ABOUT
  670 REM 2 SECONDS.
  680 REM
  690 FOR I=0 TO C STEP A:N=N+I:NEXT
  700 FOR I=0 TO C STEP B:N=N+I:NEXT
  710 FOR I=0 TO C STEP AB:N=N-I:NEXT
  720 RETURN
  800 REM -----------------------------
  810 REM SAME IDEA AS LAST SOLUTION BUT
  820 REM INSTEAD OF LOOPING THROUGH THE
  830 REM MULTIPLES IT USES GAUSS' CLOSED
  840 REM FORMULA TO CALCULATE THE SUMS.
  850 REM TAKES LESS THAN A SECOND.
  860 REM
  870 REM G(X)=X*(FLOOR(C/X)^2+FLOOR(C/X))
  880 REM F=G(A)+G(B)-G(A*B)
  890 REM
  900 T=INT(C/A):D=A*(T*T+T)
  910 T=INT(C/B):E=B*(T*T+T)
  920 T=INT(C/AB):F=AB*(T*T+T)
  930 N=(D+E-F)/2:RETURN
“Vir, intelligence has nothing to do with politics!” — Londo Mollari
Antworten