TCH (statz) | #1, Főfasz (10466) |
6863 | #1c45 | ^ | Idézet | Wed, 02 May 2012 00:41:16 +02 |
46.107.*.* | *.catv.pool.telekom.hu |
Gab: (kemi felhívta a figyelmem a kettő prím(itív)ségére, nekem meg eszembe jutott még 1-2 dolog, ezeket lekezeltem, szóval, ha már tegnap elvitted az algoritmust, akkor frissiccsé'. :]) Az sem rossz, amit kemi mondott, de ahhoz tömbökkel kell baszakodni, én itt inkább az egyesével végignézést javasolnám. Ami úgy néz ki, hogy megnézed, hogy a szám páros-e, ha igen, akkor eldobod, ha nem, akkor 3-tól kezdve maradékosan elosztod minden páratlan számmal, egészen a gyökéig. Vagy a feléig, ha nincs lebegőpontosod. (Ha nincs maradék, eldobod a számot.) Na, most mivel gondolom, hogy azért, hogy prímeket keress - ráadásul assemblyben - a kutya nem fizet, vagyis ez egy ostoba egyetemi feladat, mert ugye programozni az tud, aki jó matematikus (aha, persze), az egyetemen pedig only 16 bites és FPU mentes sux86-ot okítanak, vagyis a 8087-es FPU utasításkészletében lévő FSQRT gyökvonót kihagyjuk. Ne felejtsd, az iskola az életre készít fel, ott neked mindig prímeket kell keresned (vagy valami más ostoba matekpéldát megoldanod) és mindig valami őscsótány technológiával (QBasic, Turbo Pascal vagy 8086 assembly), mert ez a versenyképes tudás. Prímkeresés DOS alatt. Thumb up magyar közoktatás. De itt a kód, használd egész seggel. (Vö. kitörölheted vele) ; kemi felhivta a figyelmem, hogy van egy paros primszam is a ketto ; es akkor mar eszembe jutott, hogy 4 alatt minden prim, kiveve a nulla ; beleraktam ezt is, meg a kiszallokodot minek tobbszor belerakni ; a prchk szubrutin dx-ben varja a szamot, amit vizsgalni fog ; es a dl-ben fogod az eredmenyt visszakapni, ami 0, ha nem prim ; meghivasa ugy nez ki, hogy: ; MOV DX, 12345 ; CALL @PRCHK ; OR DL, DL ; JZ @NEMPRIM ; JMP @PRIM ; nem tom, hogy milyen assemblert hasznalsz, de lehet, ; hogy a cimkek ele nem kell a @ jel @PRCHK: PUSH BX MOV BX, DX ; azzal nyitunk ki kell menteni a szamunkat valahova, (mondjuk a bx-be) ; mert a sux86 egy fos es 16 bitesen osztani csak ugy lehet, hogy a forras ; a dx-ben es ax-ben van, dx a felso 16 bit (ami itt 0 mindig, sux86 rulez) ; es az ax az also 16 bit, vagyis kell mindket regiszter + egy harmadik ; a dx tehat mindig 0 lesz, az ax mindig a szamunk, az oszto pedig cx lesz ; a bx pedig nemely esetben hasznalt regiszter vagyis hasznalat elott ki kell ; menteni, visszatereskor pedig visszahuzni ; itt jon negyesre valo vizsgalat osszehasonlitjuk a szamot harommal ; es ha egyenlo vagy kevesebb, akkor akkor ket eset lehet ; ha nulla akkor nem prim es mivel dl-ben mar nulla van kiszallunk ; ha nem nulla, akkor 1, 2 vagy 3 es prim es dl-ben nem 0 van, vagyis exit CMP DX, 3 JNG @EXIT ; aztan is megvizsgaljuk, hogy paros-e a szam ; 0 & 1 == 0, 1 & 1 == 1, vagyis ha X & 1 == 1 ; akkor X == 1, de ha nem, akkor 0 es ha egy szam ; legalso bitje 0, akkor a szam paros es nem prim ; egyszoval, ha a logikai es muvelet utan ha dx-ben nulla van ; akkor kiszallunk, dl-ben (a dx also feleben) mar igy is nulla van ; vagyis csak visszahuzzuk a bx-et es return ; ha nem nulla, akkor paratlan es tovabb AND DX, 1 JZ @EXIT ; ha ide bejott a program, akkor paratlan volt ; az oszto a cx lesz, ami 3-tol indul es a szam feleig megy ; (nem full feleig, hiszen paratlan, szal floor(x/2)) MOV CX, 3 ; dx-be nulla kerul ; xor azaz kizaro vagy, onmagaval kapcsolatba hozva mindig 0 ; XOR DX, DX gyorsabb es kevesebb helyet eszik, mint MOV DX, 0 ; az ax-ben a szam van ; osztas utan az ax tartalmazza a hanyadost, dx a maradekot ; ha dx, azaz a maradek 0, akkor cx-ben egy olyan szam van ; ami maradek nelkuli osztoja az eredeti szamnak, vagyis ; bx-ben nem prim szam van @CHK: XOR DX, DX MOV AX, BX DIV CX ; szoval, ha dx-ben a muvelet utan nulla van, akkor visszaterunk ; a mar ismert modszerrel, csak itt nem csak a legalso bitet vizsgaljuk ; ha meg nem, akkor cx-hez adunk 2-t, mert csak a paratlan szamokat vizsgaljuk TEST DX, DX JZ @EXIT ADD CX, 2 ; itt most ellenoriznunk kell, hogy az oszto nagyobb-e, ; mint az eredeti szam fele ; 2 hatvanyaival ugy osztunk vagy szorzunk, hogy a regisztert annyival ; forgatjuk jobbra (osztas) vagy balra (szorzas) ahanyadik hatvanyaval ; osztunk vagy szorzunk kettonek ; x*2^n == shl x, n ; x/2^n == shr x, n ; vagyis x/2^1 == x/2 == shr x, 1 ; ha az oszto nagyobb a szam felenel, akkor a vizsgalt szam prim ; dl-be 255 kerul es visszaterunk ; ha nem, akkor folytatjuk a futast ; cmp utan a jg akkor teljesul, ha az elso parameter volt nagyobb ; (a jng meg akkor ha a masodik, vagy ha egyik sem) MOV AX, BX SHR AX, 1 CMP AX, CX JG @CHK MOV DL, 255 @EXIT: POP BX RET ; hat ennyi ; nem teszteltem, de elvileg nem kene, hogy gaz legyen veleÉs kommentek nélkül a teljes kód ismét: @PRCHK: PUSH BX MOV BX, DX CMP DX, 3 JNG @EXIT AND DX, 1 JZ @EXIT MOV CX, 3 @CHK: XOR DX, DX MOV AX, BX DIV CX TEST DX, DX JZ @EXIT ADD CX, 2 MOV AX, BX SHR AX, 1 CMP AX, CX JG @CHK MOV DL, 255 @EXIT: POP BX RET Egyfelől, régen is kiszolgált az infoipar sokmindent - nem csak szakállas faszok baszakodtak a tranyókkal - másfelől meg a balfaszokat kár volt beengedni az IT szakmába, harmadfelől meg ezt a mentalitást, hogy arra van igény, hogy nem baj, hogy szar, csak gyorsan meglegyen, hogy el tudjuk adni a balfaszoknak - ezt bilgécnek köszönhetjük, mert ő engedte be a balfaszokat, hogy legyen kit fejni, mert bilgéc nem haladást akart, hanem pénzt. (Milyen érdekes, hogy anyja-apja bankár, vajh honnan örökölt ilyen hajlamokat?) Vagy sem. Te megbíznál a GCC-ben? Költői kérdés volt. Éljen a környezetszennezés és az eszeveszett pazarlás környezetbarát gondolkodás és a takarékosság. Fillérekér' van, vegyünk még alá vasat, nincs elég szemét még, támogassuk, a trassh 4 da massmozgalmat, bazdmeg!
Termelésről, haszonról, virtuális tőkéről és értéktelen szemét értékesítéséről most ne nyissunk vitát. Ne érts félre, értem amit mondasz és azt is tudom, hogy abban igazad van, hogy ez így megy. És azt is tudom, hogy felesleges lázadnom ellene. Nade, elhinnem, hogy ez így jó és szeretni, pláne terjeszteni mint igét...hát had ne kelljen mán! |