5 szám, ha 4 ugyanaz-->írjon ki valamit, hogyan lehet leprogramozni (Sima c nyelv)?
Sziasztok,
A helyzet a következő:
írnom kéne egy c nyelű programot, a programnak van egy része, aminek a bemenete 5 véletlen szám(egész),az összeset megvizsgálom és ha találok benne 4 ugyanolyan számot
(pl bemenet:4 4 4 1 4)
akkor irja ki pl "ok".
Nem tudok rájönni egyszerűen, hogy hogyan kellene ezt megvizsgálnom(gondolom valamilyen if-el de nem jövök rá hogy hogyan).
Ha azt a részét a programnak valaki letudná nekem írni(vagy rávezetne legalább, hogy mit kéne alkalmaznom),hálás lennék érte.
Köszönöm előre is a válaszokat.
Több módszer lehet.
Vedd észre, hogy csak akkor nem teljesül a feltétel, ha legalább 3 különböző szám létezik.
Tehát két változót definiálsz, az első első számot, a második a második előforduló, az elsőtől különböző számot reprezentálja. Nyilván akkor adsz nekik értéket, amikor először találkozol velük. Minden egyes inputra megvizsgálod, hogy megegyezik-e valamelyikkel. Ha nem egyezik meg, akkor nem teljesül. Ha végigfut az algoritmus, akkor pedig teljesül.
Létezik általánosabb algoritmus is, hogy létrehozol egy számláló tömböt. A tömbnek a mérete a bemenet értékkészlete. Tehát ha csak egyjegyű természetes számokat kaphatunk inputként, akkor 10 méretű tömb, mindegyik tagja egy-egy számnak az előfordulását számolja. Amint eléri valamelyik elem a négyet, akkor a folyamat megáll. Ez az algoritmus könnyen kiterjeszthető akármekkora inputra.
A legegyszerűbb szerintem, ha sorba rendezed a tömböt (qsort) és csak akkor íratod ki, hogy "ok", ha a 0. és a 3. elem VAGY az 1. és a 4. elem értéke egyenlő.
Ez természetesen nem általános megoldás, de ebben az esetben működik.
#1 Persze, és ha a teljes integer számtartományon akarunk vizsgálni, akkor csináljunk egy milliárdos nagyságrendű tömböt? :D
A legegyszerűbb megoldás egy map-hez hasonló adatszerkezet készítése. Hogy ne komplikáljuk túl a dolgot, engedjük el a faszerkezet, illetve a hashelés funkcionalitását, és egyezzünk ki egy egyszerű, lineáris keresésen alapuló megoldáson. Készítesz egy struktúrát ami tartalmazza a számértéket mint azonosító, és az előfordulását mint érték. Ezekből a structokból definiálsz egy N méretű tömböt (N az input mérete), és minden inputelem feldolgozásakor megnézed, hogy szerepel-e már a tömbben az adott elem, és ha igen, akkor növeled az előfordulását 1-el. Nyilván a tömb méretét folymatosan számon kell tartani. Ha neagyisten az előfordulása egy elemnek épp eléri a kitűzött célértéket (jelen esetben 4), akkor azonnal meg is állhat a feldolgozás.
Az nagyon rossz módszer, ha sorbarendezzük az elemeket, majd végigiterálunk a tömbön, megszámoljuk, melyik szám hányszor szerepel? Bevezetünk egy változót a maximum előfordulás tárolására.
Ha a maximum előfordulás értéke nagyobb v egyenlő, mint a darabszám, ahányszor egy számnak minimum szerepelnie kell, true-val tér vissza a függvény.
Amúgy megcsináltam ma az 1. által javasolt mádosik módszert.
A vizsgálandó tömb legkisebb eleme 1-10 között generálódott, a legnagyobb a legkisebb értéke és 100 között, a tömb hossza 1 és 50 között. Így elég stabilan működött.
Viszont igen, pl egész int tartomány esetén ez már nem lenne működőképes.
Közel se C-t tanulok amúgy, bár ez a feladat elég nyelvfüggetlen.
Mondjuk ez annyira nem nyelvfüggetlen, hogy pythonban egy sor a megoldás:
print ("ok" if len(set(a))<=2 else "")
De az általános megoldás is megadható egy sorban.
Nem mindegy, hogy milyen struktúrákat tartalmaz egy nyelv.
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!