Code: Alles auswählen
for i in range(1, 1000):
sum = 0
if (i % 5 == 0) or i % 3 == 0:
sum += i
print(sum)
Code: Alles auswählen
for i in range(1, 1000):
sum = 0
if (i % 5 == 0) or i % 3 == 0:
sum += i
print(sum)
Vielen Dank. Jetzt hat es funktioniertSirius3 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.
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__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
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