Hirdetés
- Beárazták a Nubia Z80 Ultra európai verzióját
- Hivatalos a OnePlus 13 startdátuma
- Honor Magic7 Pro - kifinomult, költséges képalkotás
- Xiaomi 15T - reakció nélkül nincs egyensúly
- „Új mérce az Android világában” – Kezünkben a Vivo X300 és X300 Pro
- Fotók, videók mobillal
- EarFun Air Pro 4+ – érdemi plusz
- Honor 200 - kétszázért pont jó lenne
- Milyen okostelefont vegyek?
- Apple Watch
Új hozzászólás Aktív témák
-
-
EQMontoya
veterán
válasz
Pttypang
#5222
üzenetére
Ejj, ha!
No, akkor okítsunk.

Először is: osztóJa!

Másodszor: szájbaszexuálnád a nevemben, aki arra nevel, hogy magyar változóneveket és függvényneveket használjatok?
Harmadszor: Optimalizáljunk:
-Ha a megadott szám kisebb, mint 1000, akkor elég a megadott számig menni. Tehát a ciklusfeltétel: i<min(n,1000). Illetve ennek is elég a feléig menni, mert különben ugyanazokat a számokat találod meg fordítva. Tehát i<=min(n,1000)/2. Azért kisebbegyenlő, mert kihasználtam gonoszul az egész osztást.
-Gondolkodjunk is: a második ciklus tök felesleges. Minden számhoz csak egy másik olyan tartozik, amivel összeadva az öszeg n lesz. Tehát, amit vizsgálnod kell: prime(i) && prime(n-i). Ezzel kész is vagy.Tehát:
for(i=1;i<=min(n,1000)/2;i++)
{
if(prime(i) && prime(n-i))
{
printf(...);
}
}No, ez már így nem is lenne rossz, most már cak a prímtesztelést kell kicsit okosítani. Maradjunk a primitív módszereknél, de ennél azért kicsit okosabban. Ha egy szám nem prím, akkor előáll két szám szorzataként. Ebből a kettőből az egyik kisebb, vagy egyenlő, mint a gyöke, tehát elég addig nézni.
Osztókat számolni tök felesleges, az első osztónál ugyanis biztosan nem lehet prím.Tehát:
for(i=2;i<=sqrt(n);i++)
{
if(!n%i) //csalok: ez akkor igaz, ha a maradékos osztás maradéka 0 - tehát osztható
{
return false; //van osztója, ami nem egy és nem önmaga
}
}
return true; //ha a gyökéig nem volt osztója, biztos prím.Máris mennyivel szebb, ugye?

-
válasz
Pttypang
#5123
üzenetére
Gyakorlaton atengedtek, par aprobb hibam volt, pl a kiiratasnal a strukturabol nem tudtam kiszedni az adatot, hanem a memoriacimet irattam ki..

printf("Fapapucsbol ennyi van: %d", &fapapucs->db");
Ez volt az egyetlen verzio, amit elengedett a fordito, de igy meg a memoriacimet irja ki. -
válasz
Pttypang
#5114
üzenetére
- a 'kerulet' valtozot inicializalni kene (0-ra)
- a tomboket (es kb. mindent C-ben) 0-tol kezdodoen indexalunk, tehat az elso elem indexe 0, az n. elem indexe n-1, tehat a lehet_e_haromszog-ben az indexeket csokkentsd eggyel
- if (lehetvagynem = 1)
nagyon tipikus C/C++ hiba: a '=' operator ERTEKADAS, nem pedig egyenloseg-ellenorzes. Az ertekadas eredmenye az ertek. C-ben az if utan kovetkezhet szam is, nem csak boolean ertek (ha nem nulla, akkor igaznak szamit), tehat
if (a = 5) {
// ez itt mindig vegrehajtodik, mert erteket adtal a-nak, es az nem nulla
}Szoval if (lehetvagynem == 1) a helyes.
Te meg az elejen vagy, szoval ha lehet, szokd meg, hogy ugy tesztelunk egyenloseget, hogy bal oldalon van a konstans. Ergo:
if (1 == lehetvagynem) { }
.. ugyanis ha veletlenul elgepeled, akkor szolni fog a fordito.
-
válasz
Pttypang
#5112
üzenetére
Erre is jo, de alapvetoen ez nagyon szuk resze a pointerek felhasznalasi modjanak. Azt gondold vegig, hogy imperativ programozasi nyelvekben (pl. C) megkulonboztetunk ket dolgot:
- ertek
- identitasTehat ha van ket valtozonk:
int a = 5;
int b = 5;.. akkor az ertekuk megegyezik, az identitasuk nem. A pointer arra jo, hogy ne erteket kezelj, hanem identitast. Ha atadom egy fuggvenynek a 'b' valtozo erteket, akkor az 5-ost adom at. Az eredeti b-vel (az identitassal) nem tud a hivott fuggveny semmit sem kezdeni, hiszen arrol nem tud, o csak az erteket (5) latja. Ha a b-re mutato pointert adom at (&b), akkor a hivott fuggveny az identitasrol tud, meg tudja valtoztatni b erteket, ha akarja.
Kepzelj el pl. egy fuggvenyt, ami kicsereli ket valtozo erteket. Ezt nem lehet megcsinalni csak ertekek atadasaval -- a 'csere' fuggveny bemenete ket _identitas_, hiszen ertekeket nem lehet megcserelni, azok ugyanugy ertekek maradnanak.
Funkcionalis nyelvekben (pl. Lisp, ML-leszarmazottak) nincs szukseg ilyesmire, mert ott csak ertekek vannak, identitas nincs. (Illetve van, csak sokkal jobban kezbentartott modon kezeljuk.)
-
válasz
Pttypang
#5110
üzenetére
Vegulis ezen kivul nincs tul sok dolog. Par aprosag:
- az operatorok probalnak okosak lenni, ezert ha pl. inkrementalsz egy pointert (ami ugye egy sima elojel nelkuli egesz szam) akkor az nem feltetlen egyet ugrik, hanem annyit, amekkora annak a tipusnak a merete, amire mutat. Tehat pl. egy 64 bites double-ra mutato pointer egy 32 bites architekturan 8 bajttal novekszik, ha inkrementalod.
double ertek = 5;
double * a = &ertek;
printf("%p\n", a);
a++;
printf("%p", a);>> 09FFB28
>> 09FFB30
Ketto kulonbsege: 8- a tomb az nem mas, mint a tomb kezdetere mutato pointer
.. most jo lenne, ha konkret dolgokat kerdeznel

-
válasz
Pttypang
#5105
üzenetére
Van a neten csomofele leiras, erdemes rakeresni, de probaljuk meg itt is.
Ugyebar C-ben (es mas imperativ prog. nyelvekben is) vannak valtozoink, vagy nevezzuk oket inkabb ertekeknek, mert az tokmindegy, hogy valtoznak-e vagy sem. A forditonak megprobaljuk megmondani, hogy milyen tipusu az az ertek, amit letrehozunk. (A tovabbiakban tegyuk fel, hogy sima 32 bites arhichitekturan vagyunk). Pl.:
double a = 1;
Egy valtozorol mindig ket dolgot tudunk: mekkora helyen fer el (hany bitnyi hosszu), es hogyan ertelmezzuk. Azt, hogy hogyan/minek ertelmezzuk, szoktak tipusnak is nevezni.
Most 'a'-rol a kovetkezoket tudjuk:
- 64 bitnyi informacionk van
- ezt egy elojellel rendelkezo lebegopontos szamkent ertelmezzukHa van egy ilyenunk:
double * a;
.. akkor errol az tudjuk, hogy
- 32 bitnyi informacionk van
- ez egy egesz szam, es ugy ertelmezzuk, mint egy memoriacimet. A memoriacimen pedig egy 64 bit hosszu lebegopontos szamot talalunk.Tehat a pointer egy jellemzoen 32 vagy 64 bitnyi informaciot tartalmazo szam. A memoria szepen be van szamozva 0-tol 2^32 vagy 2^64-ig. Ha ahhoz a memoriarekeszhez mesz, aminek a szama megegyezik a pointer ertekevel, akkor ott egy olyan erteket talalsz, aminek a tipusa a pointer tipusaban jelezve is van.
A pointert a * jelzi altalaban. Ha van pl. egy
double ** a;akkor az a kovetkezo jelenti, analog modon:
- van egy 32 bites ertekunk
- ez egy egesz szam, es ugy ertelmezzuk, mint egy memoriacimet. A memoriacimen pedig egy 32 bit hosszu egesz szamot talalunk, amit ugy ertelmezunk, mint egy 32 bites erteket, amit ugy ertelmezzunk, mint egy memoriacimet. A memoriacimen pedig egy 64 bit hosszu lebegopontos szamot talalunk.Ez idaig vilagos?
(Tobbieknek: szandekosan vagyok pontatlan az int, double, etc. meretevel kapcsolatban.)
Új hozzászólás Aktív témák
● olvasd el a téma összefoglalót!
● ha kódot szúrsz be, használd a PROGRAMKÓD formázási funkciót!
- AMD K6-III, és minden ami RETRO - Oldschool tuning
- Mibe tegyem a megtakarításaimat?
- D1Rect: Nagy "hülyétkapokazapróktól" topik
- Álláskeresés, interjú, önéletrajz
- Kuponkunyeráló
- Harcba és Rómába vezet az új AMD Software
- Bambu Lab 3D nyomtatók
- Autós topik
- Nintendo Switch 2
- Milyen TV-t vegyek?
- További aktív témák...
- POINT S WINTER S 185/65R15 88T téligumi acélfelnivel
- ThinkPad 15,6",core i3 6100u(4x2,3Ghz)IntelHD VGA,8-16GB RAM,240SSD,Jó akku,nagyon szép állapot
- 12700kf,RTX4060 8gb,32gb ddr5,6T m.2 ssd,stb .Új komplett középkategóriás gamer pc .
- Acer 15.6",FullHD,core i3 8145U(4x3,9Ghz)MX230 2/4GB DDR5VGA,8-20GB RAM,SSD,szép állapot,Win.11
- Iphone 12 Pro Max 128GB Grey, kijelzőfólia és Speck tok
- WYBOT C2 Vision AI vezérelt medenceporszívó
- HIBÁTLAN iPhone 12 Mini 64GB Green -1 ÉV GARANCIA - Kártyafüggetlen, MS3453, 100% Akkumulátor
- ÁRGARANCIA!Épített KomPhone i5 10400F 16/32/64GB RAM RTX 3060 12GB GAMER PC termékbeszámítással
- 143 - Lenovo LOQ (15IRH8) - Intel Core i5-13500H, RTX 4060 (ELKELT)
- Telefon felvásárlás!! iPhone 12 Mini/iPhone 12/iPhone 12 Pro/iPhone 12 Pro Max
Állásajánlatok
Cég: Laptopműhely Bt.
Város: Budapest
Cég: NetGo.hu Kft.
Város: Gödöllő





