Hogyan csináljam meg ezt a feladatot? Egyszerűen nem értem ezt az egész matek példát. Ha érteném biztos le tudnám programozni.
6.8. Írjon egy programot, ami adott a és b egész korlátok esetén összeadja a 3 és 5 korlátok közé eső
többszöröseit.
Vegyük például az a=0, b=32 t
az eredménynek 0 +15 +30 = 45 nek
kell lenni.
Módosítsa úgy a programot, hogy az adja össze a 3nak
vagy az 5nek
az a és b határok közé eső
többszöröseit. A 0 és 32 határokkal az eredménynek : 0 + 3 + 5 + 6 + 9 + 10 + 12 + 15 + 18 + 20 + 21 +
24 + 25 + 27 + 30 = 225 nek
kell lenni.
Egy plusz kérdést engedjetek meg.
Melyiknek van jövője?
python 2 vagy 3
Hol alkalmaznak leginkább python programozókat?
Az első feladatban a 15-tel oszthatóakat kell kiírni egy intervallumon belül.
Tehát kell egy ciklus, amelyben a ciklusváltozó 15-ösével lép, a ciklus felső határa pedig "b".
A ciklusváltozó kezdőértéke pedig "a" tizenöttel való osztásának felkerekítése visszaszorozva 15-tel.
Az egész kb. ilyen:
int s = 0;
for(int i = ceil(a/15)*15; i < b; i+=15) s+=i;
A másik feladat az előzőből származtatható:
int s = 0;
for(int i = ceil(a/3)*3; i < b; i+=3) s+=i;
for(int i = ceil(a/5)*5; i < b; i+=5) s+=i;
for(int i = ceil(a/15)*15; i < b; i+=15) s-=i;
Előszőr az összes 3-mal oszthatót adjuk össze, aztán hozzáadjuk az összes 5-tel oszthatót, de a 3-mal és 5-tel oszthatóakat viszont 2x számoltuk így, ezért a 15-tel oszthatóakat meg levonjuk.
Ennyi.
Mindegy ezt nem értem túl bonyolult nekem.
Még soha nem számoltam ilyet.
Jó, nézzük az elsőt.
A feladat az, hogy az [a, b] intervallumba eső összes 3-mal és 5-tel egyszerre osztható számok összegét kell meghatározni.
Ami 3-mal és 5-tel is osztható, az valójában 15-tel osztható, tehát 15-nek az intervallumba eső többszöröseinek összegét kell meghatározni.
Igazából sokat programozni sem kell: az 'a' és 'b' közé eső 15-tel osztható számok összegét megkaphatjuk úgy, hogy vesszük a 0 és 'b' közé esők összegét és ebből kivonjuk a 0 és 'a' közé esők összegét. Ha nem 15-tel oszthatókat néznénk, hanem mondjuk 3-mal oszthatóakat, akkor itt egy sorozat:
0, 3, 6, 9, 12, 15, 18, 21, 24, 27, 30, ...
Ha most a 10 és 20 közé esőket kell összeadni, akkor az úgy is kijön, hogy 20-ig az összeset összeadod, majd 10-ig és ez utóbbit kivonod:
0 + 3 + 6 + 9 + 12 + 15 + 18
- 0 + 3 + 6 + 9
= 12 + 15 + 18
Tehát csak a 10 és 20 közöttiek összege marad eredménynek. Na, ez ugyanúgy működik akkor is, ha nem 10 és 20 között kell, hanem a és b között, meg akkor is, ha nem hárommal nő a sorozat, hanem 15-tel.
Tehát ha lenne egy képlet, ami az előző két összeget kiszámolja, akkor azokat kivonva megvan az eredmény.
Na, az összeg kiszámításán nem kell gondolkodni, a wikipedia ( [link] alapján:
s = d*n*(n-1)/2
Ahol s az összeg, d a növekmény (a feladatban 15), n a sorozat tagjainak száma.
Nekünk azonban nem a sorozat tagjainak száma, hanem a sorozat vége van inkább meg. Pl. az, hogy a=0 és b=32.
Meg kell tehát nézni, hogy b-ben hányszor van meg a 15. Ez a b/15 egészrésze lesz. a-ra ugyanez. A sorozat eleme még a 0, tehát az egészrészhez még egyet hozzá kell adni.
Tehát pl. a 32-ben a 15 kétszer van meg, de mivel a 0 is a sorozat tagja (ld: 0, 15, 30), ezért n=3. a-ra ugyanígy kijön a hozzá való n.
Tehát a képlet, ami az egész eredményt megadja ("nagy" sorozat összegéből kivonva a "kis" sorozat összegét, ld. fönt):
s = d(nb-1)nb/2 - d(na-1)na/2
ahol d a 15, nb és na a b-ig és a-ig lévő tagok száma az összegben:
na = egész(a/d) + 1
nb = egész(b/d) + 1
Ennyi.
Ellenőrizzük le! Helyettesítsük az alábbiakat a feladatból:
d=15, a=0, b=32
tehát akkor
na = 0/15 + 1 = 1
nb = 32/15 + 1 = 2 + 1 = 3
A nagy képletbe beírva:
s = 15(3-1)3/2 - 15(1-1)1/2 = 45 - 0 = 45
Ha ennyiből nem érted, akkor a programozást hagyd inkább, boldogabb leszel más szakmával.
A másodikhoz az előbbi képletet használhatjuk, nevezzük el mondjuk s-nek:
s(d, a, b) = ...
Az előző példában s(15, 0, 32) szerepelt.
Ha a 3-mal vagy 5-tel oszthatók kellenek (tehát nem 3-mal és 5-tel egyszerre oszthatók), akkor
S3 = s(3, a, b)
S5 = s(5, a, b)
Viszont így a 15-tel oszthatókat 2x számoltuk bele az összegbe, azokat le kell vonni:
S = s(3, a, b) + s(5, a, b) - s(15, a, b)
Ennyi.
Ellenőrzés:
S = s(3, 0, 32) + s(5, 0, 32) - s(15, 0, 32)
s(3, 0, 32) = 3*11*(11-1)/2 - 0 = 165
s(5, 0, 32) = 5*7*(7-1)/2 - 0 = 105
S = 165 + 105 - 45 = 225
Igaz ez Pascal:
Program Szamol;
uses Crt;
var i, i1 : integer;
begin
i:=0;
i1:=0;
for i:=0 to 32 do
if ((i mod 3)=0) or ((i mod 5)=0)
then i1:=i1+i;
WriteLn(i1);
Readkey;
end.
Elég egyszerű nem ?
Kapcsolódó kérdések:
Minden jog fenntartva © 2024, www.gyakorikerdesek.hu
GYIK | Szabályzat | Jogi nyilatkozat | Adatvédelem | Cookie beállítások | WebMinute Kft. | Facebook | Kapcsolat: info(kukac)gyakorikerdesek.hu
Ha kifogással szeretne élni valamely tartalommal kapcsolatban, kérjük jelezze e-mailes elérhetőségünkön!