Jump to content
BulForum.com

zada4a ot olimpiada


ScherZ

Recommended Posts

predpolagam che pod linux prosto dosta chesto programata biva prekysvana

 

 

btw vie ste ludi :) shto mtaka se fanahte s taia zadacha nachi naistina imalo developeri v toq warez :)

 

ama se pak kvo mislite nad vaprosa : kak e zadachata za 1vi krag na olimpiada za 11ti klas pri polojenie che tezi hora na C++ sa oshte na cikal for .. :)

 

 

btw ot liubopitstvo pod linux ako se zabrani programata izobshto da bade prekasvana t.e. da e ne maskiruema ( ne che znam kak no se sha moje ) kakva sha e razlikata 10x ako nqakoi probva

Link to comment
Share on other sites

  • Replies 50
  • Created
  • Last Reply

Emi az sym 11 klas i nie sme vzeli CQLOTO C i sq uchim C++ (obekti, potoci ...). A btw to v taq programa osven for(;;) pochti nishto drugo ne ti trqa :)

 

Atva deto go pitash ako razbrah kvo imash predviiid ... Kvo oznachava "da biva prekysvana". S Ctrl+C li :) Ili moje bi shtoto izpolzva prekaleno mnogo pamet ? Ili mai nito edno ot dvete :) Abe ... vij man signal, kill -l, nomerata na signalite, nauchi se kvo podava ctrl-c, ctrl-z i t.n. E naprimer Ctrl+C podava SIGINT. Ama kat ne ta znam kvo iskash da napraish ...

Link to comment
Share on other sites

Emi az sym 11 klas i nie sme vzeli CQLOTO C i sq uchim C++ (obekti, potoci ...). A btw to v taq programa osven for(;;) pochti nishto drugo ne ti trqa :)

 

Atva deto go pitash ako razbrah kvo imash predviiid ... Kvo oznachava "da biva prekysvana". S Ctrl+C li :) Ili moje bi shtoto izpolzva prekaleno mnogo pamet ? Ili mai nito edno ot dvete :) Abe ... vij man signal, kill -l, nomerata na signalite, nauchi se kvo podava ctrl-c, ctrl-z i t.n. E naprimer Ctrl+C podava SIGINT. Ama kat ne ta znam kvo iskash da napraish ...

Май JOKe като казва прекъсване има в предвид, че процесора я оставя за момент, обръща внимание на друго момиче и после се връща отново при нашата позната.... :P

ЕДИТ: оправям си правописни грешки :=))))

Link to comment
Share on other sites

... Kvo oznachava "da biva prekysvana". S Ctrl+C li :) Ili moje bi shtoto izpolzva prekaleno mnogo pamet ? Ili mai nito edno ot dvete :)

JOKe може би има в предвид прекъсванията на операционната система при управление на процесите (нишки, семафори..). ДОС е еднозадачна операционна система (не че няма прекисвания, но те се случват точно в определени моменти при системните събития и спрямо многозадачните ОС са по-малко). Така че JOKe е много прав че под LINUX хавата може да се забавя от прекъсванията от другите процеси (а под QNX хавата ще е и по-зле предполагам).

Link to comment
Share on other sites

BroadMan lyubo tochno za tiq procesorni prekasvaniq govorih :) da zavisi si ot Os-a i linux naistina zaradi drugi neshta koito sa pusnati i za drugi procesi moje prosto da izchakva i se pak nali moje da se napravi programka koqto da zabrani da byde prekasvana ta ako moje na C++ shtoto as neznam kak ama sigorno moje nqakoi ako q napravi da proveri na linux kak varvi shtoto moje prichinata da ne e samo shtoto procesor-a chaka ami i ot neshto drugo koeto e dosta stranno

 

ta ako se zabrani prekasvaneto na procesa da nemoje da se masquerva se sha svarshi po barzo a ako i pod windows i pod linux se sprat nqakak prekasvaniqta na procesora triia da svarshat ednakvo byrzo

 

ZA CIALOTO C xaxa shtom kazvash cialoto C iasno e kolko ste nauchili pa i sq uchish C++ ? obektno orientiran i potoci ? potoci v C ne si li uchil ?

 

pak i kak razgranichi tochno C ot C++ ne razbrah 1vo si nauchil cialoto C sq uchish obektno orientiranoto C++ e da ama ima i procedurno C++ koeto ne e bash 1kym 1 s C-to nego uchi li go ?

 

pa za CTRL+C nqama kvo da kaja :)

Link to comment
Share on other sites

aa btw ako na C nemoje da se sprat prekasvaniqta mislq che na asembler moje taka che asm { :)) ala bala } ne che znam kvo se pishe ama se pak ima nachin

 

edita e shtoto bez da iskam dadah replay na sebe si hahaha

Link to comment
Share on other sites

да ви бодна ли един избиващ рибата въпрос :woot ?

 

проблема е следния - имате 32 битово число X което като се умножи по 8088405h трябва долните 32 бита на резултата да са в интервала 8702AC00h-879A2D34h

 

въпроса ми е може ли да се намерят сройности на X някакси по-елегантно, без брутални методи

Link to comment
Share on other sites

не може. Най-малкото трябва да се обходи интервала, който си дал за долните 32 бита и за него може да се намират стойности за Х като се използва делене (остатък).

Link to comment
Share on other sites

JOKe: emi taq rabota stava s prioriteti. Sloji prioriteta na binary-to na max i vij kolko po-byrzo shte svyrshi (az lichno mislq che nqma da ima osobena razlika ... daje absurt da q usetish)

 

tedy ... eee vednyj i ti da sbyrkash :) Aide pak da vi izvadq ... edna hitrost :)

 

kicko: eto ti hint:

neka imame chetiri 16bit chisla, a, b, c, d

(a + 0x10000*B) * (c + 0x10000*d) = 0x100000000*b*d + 0x10000*b*c + 0x10000*a*d + a*c

na teb ti trqbva 0x8702ac80 < ((b*c + a*d) & 0xffff) + a*c < 0x879a2d34

neka a=0x8405 i b=0x808 (nizha i visha tetrada ot 0x8088405)...

a + 0x10000*b e tochno dolepenoto chislo (ba)

0x8405 + 0x10000*0x808 = 0x8080000 + 0x8405 = 0x8088405

kato umnozhavash dvete sumi i razpishesh poluchavash slednoto:

v gornite 32bit-a na poluchenoto 64bit chislo imash b*d

v dolnite 32bit-a imash a*c

kum tova se pribavja b*c + a*d umnozheno po 0x10000

znachi dolnite ti 32bit-a sa a*c + ((b*c + a*d) & 0xffff) == a*c + (b*c)&0xffff + (a*d)&0xffff

neizvestnite sa ti c i d

znachi imash da namerish 2 takiva 16bit chisla c i d : 0x8702ac80 < (b*c)&0xffff + (a*d)&0xffff + (a*c) < 0x879a2d34, kato znaesh a i b

 

dano da ne sym obyrkal nqkoq bukva ... (mnoo mi sa spi, she izvinqvate ako e taka). Ama taka kato si go proverqvam mislq, che sichko e qsno.

Link to comment
Share on other sites

Shiro, честно казано и аз си мислех за подобен начин, но понеже ми се спеше ужасно (както и сега) не се замислих повече, а наум ми дойде само това. Все пак не се занимавам особено много със съсстезателно програмиране като теб ;) ;)

Link to comment
Share on other sites

мерси много

на мен не ми достига мозък да го разбера това, та камоли да го измисля :wir

 

и затова си го направих по тъпия начин

 

и работи (!), но ми направи впечатление нещо друго което хич не ми хареса - не може ей така да си уможаваш 32бит числа и да получаваш 64бит с обикновенния оператор "*" ами трябва да търсиш някви забутани функции като Int32x32To64 (намерих я случайно след като си свърших работата вече) :angry1

иначе като напиша c = a * b и съм дефинирал "a" и "b" като unsigned long а пък "c" като ULONGLONG или като __int64 на асемблер знаете ли как го превежда :

mov eax, [ebp-0x34]           ; това е "a"
imul dword ptr [ebp-0x38]     ; това е "b"
xor edx, edx                  ; ах ти мръсник такъв !!!!!!!!
mov [ebp-0x44], eax           ; долните 32бита на "c"
mov [ebp-0x40], edx           ; горните 32бита на "c"

 

защо нулира горните 32 бита не можах да разбера :confused

има си ги, получил си ги е от умножението, има си 64бит променлива където може да ги сложи, не му коства нищо да ги сложи там, щото и без това си слага EDX, ама той незнайно защо решава да ги изхвърли тези 32 бита :wacko:

 

компилатора е този на BCBuilder 5, да не би да иска някъде от опциите да се разрешат 64бит изчисленията

Link to comment
Share on other sites

:D ами махни го това xor edx,edx

или го напиши специално тези 2-3 реда на асемблер.

шегувам се, ами вземи Визуал Студио-то, там може от раз да ти тръгне.

Аз имам повече идея от Делфи, и там си има Int64, но и там нулира старшите 32 бита. пробвай на асемблер директно

Link to comment
Share on other sites

на асемблер знаете ли как го превежда :

<!--QuoteEBegin-->mov eax, [ebp-0x34]          ; това е "a"<!--QuoteEBegin-->imul dword ptr [ebp-0x38]    ; това е "b"<!--QuoteEBegin-->xor edx, edx                  ; ах ти мръсник такъв !!!!!!!!<!--QuoteEBegin-->mov [ebp-0x44], eax          ; долните 32бита на "c"<!--QuoteEBegin-->mov [ebp-0x40], edx          ; горните 32бита на "c"<!--QuoteEBegin-->

 

защо нулира горните 32 бита не можах да разбера  :confused

Според мен не ги нулира

Link to comment
Share on other sites

Според мен не ги нулира

хм, интересно ми е да чуя мнението ти, а какво ги прави според теб ?

 

ако говориш сериозно и не се шегуваш, значи асемблера доста през пръсти си го чел, в противен случай - очаквам продължението на вица

Link to comment
Share on other sites

mov eax, [ebp-0x34]          ; това е "a"<!--QuoteEBegin-->imul dword ptr [ebp-0x38]    ; това е "b"<!--QuoteEBegin-->xor edx, edx                  ; ах ти мръсник такъв !!!!!!!!<!--QuoteEBegin-->mov [ebp-0x44], eax          ; долните 32бита на "c"<!--QuoteEBegin-->mov [ebp-0x40], edx          ; горните 32бита на "c"<!--QuoteEBegin-->

 

Ami problema ti e che umnozavash 2 takiva chisla... Kogato pravish operacia nad 2 ednakvi obekta poluchavash drug takav obekt. Ot fakta che sa 2 broja 32 bitovi chisla sledva che trjabva da poluchish drugo takova chislo. A za da go zapishe vav 64 bitovo chislo sled tova ochevidno trjabva da se nulirat starshite 32 bita... I az sam psuval grozno na takiva maloumni izpalnenia. Spasenieto e da si cast-nesh chislata kakto trjabva.

 

Naj-ochevidnia primer e :

 

double x = 10 / 3;

 

a poznajte kakvo shte e sadarzanieto na x ? 3.333333 ??? neeee ne poznahte!!! resultata e 3.00... poradi sashtata prichina : delim 2 celi chisla javno iskame resultata da e takav... za da poluchite pravilen resultat se pravi:

 

double x = 10.0 / 3.0;

 

cheers!

Link to comment
Share on other sites

:D  ами махни го това xor edx,edx

или го напиши специално тези 2-3 реда на асемблер.

шегувам се, ами вземи Визуал Студио-то, там може от раз да ти тръгне.

Аз имам повече идея от Делфи, и там си има Int64, но и там нулира старшите 32 бита. пробвай на асемблер директно

mda. sega obarnah vnimanie i na tozi post. abe momcheta vie helpovete i drugi podobni dokumentacii nikoga li ne chetete? verno pisaneto na asembler e hubavo neshto ama tochno za tozi sluchaj mi se vidi leko kato da grymnesh muha s chereshovo topche prosto shtoto si zabravil kade ti e vestnika (ili vaprosnia ured skovan ot djado ti ot parche darvo i malko koza za celta shtoto tia plastmasi deto gi prodavat obiknoveno za nishto ne stavat)

Link to comment
Share on other sites

djadomraz, това с 10.0/3.0 всеки го знае, дори начинаещите се сблъскват с тази особеност на C. На Делпфи е съвсем различно затова няма да аналогизирам.

И ми е интересно в какав смисал не четем ли хелповете? Интересно ми е да чуя с какво не си съгласен?

И още нещо: процесора хич не е глупав когато умножава две 32 битови числа резултата е точно 64-битова стойност и той запазва резултата именно в два 32-битови регистъра - EDX:EAX, това ако не си го разбрал още, не знам защо постваш тука

Link to comment
Share on other sites

tedy, absolutno e praw djadomraz, na men mi go obiasniha po sushtia nachin i za moia smetka si ostawa towa che ne sum go znael.

abe kakto winagi se okazwa - ne e kompilatora za takowane, ami programista  :D

:) kicko, на djadomraz му признах, че е прав за компилатора и случая 10/3, нали казах, че всеки го знае това :confused ..

А и по-рано казах, че и в Делфи го прави същото с нулирането.

А умножаването на 32-битови числа с асемблер поне го пробвайте и ще видите че работи, дори от вътрешността на Делфи (с точно 3 реда код)! Това ако оспорите, почвам да се съмнявам дали изобщо процесорите които съм имал не са били световен заговор срещу мене да умножават правилно 32бит х 32бит=64бит! :wacko: :wir :lol:

И добре, кажи как да убием мухата с вестника, че не разбрах..

Не ми се е налагало да умножавам до с 64 бита ресултат, но например в Делфи как ше стане номера??

Link to comment
Share on other sites

Така е, сайтът им често не бачка. За него се грижат добри професионалисти, познавам ги, но като се има предвид, че сайтът е базиран на Java, не е за учудване, че често го няма  B) .Макар, че там основно изучавахме именно Java като основна технология ,аз въобще не съм фен на тази технология, просто е много тежка, има доста бъгове (все пак е сравнително нова).

njakak ne mi se struva na men osobeno profesionalno da izberesh bugava platforma. a i java-ta izobshto ne e tolkova nova kato tehnologia... fakta obache che govorim za universitet leko ogranichava budgeta i saotvetno mozete da si predstavite kakav internet imat... a da ne pochvam temata che kato cjalo v BG neta ne e koj znae kakvo i nejasno koga shte dojde vaprosnoto svetlo badeshte deto ot tolkova vreme go chakame.....................

Link to comment
Share on other sites

djadomraz, това с 10.0/3.0 всеки го знае, дори начинаещите се сблъскват с тази особеност на C. На Делпфи е съвсем различно затова няма да аналогизирам.

И ми е интересно в какав смисал не четем ли хелповете? Интересно ми е да чуя с какво не си съгласен?

И още нещо: процесора хич не е глупав когато умножава две 32 битови числа резултата е точно 64-битова стойност и той запазва резултата именно в два 32-битови регистъра - EDX:EAX, това ако не си го разбрал още, не знам защо постваш тука

viz sega kak mislish otnovo ot gledna tochka na asemblera. objasnih ti odeve che problema e che compilatora kato vidi 2 chisla ot edin i sashti tip i posle pri smetkite vrashta resultat ot tozi tip. znachi za compilatora umnozenieto na 2te 32 bitovi chisla trjabva da varne otnovo 32 bitovo chislo, nali taka? znachi za da zapishe resultata ot tova 32 bitovo chislo vav 64 bitovo chislo toj go dopylva sas nuli, saotvetno zatova go ima i vaprosnita xor.

 

sja napravi si slednia experiment definiraj si 2 promenlivi ot tipa kojto iskash da poluchish. slagash v ednata stojnostta na parvia operand, a v drugata tazi na 2ria. togava gi umnozavash i gi prisvojavash na promenlivata kadeto iskash da poluchish resultata.... analogichno e na slednoto

 

double a = 10;

double b = 3;

double c = a/b;

 

ako imash obache:

 

int a = 10;

int b = 3;

double c = a/b;

 

resultata shte ti e greshen. smjatam che po-ocheviden primer ot tova njama nakade poveche

 

svetna li ti sega kade tochno e problema i zashto compilatora vapreki che stojnostta na EDX e absoljutno pravilna toj ja nulira naj-maloumno? :)

Link to comment
Share on other sites

Повтарям, че се грижат добри професионалисти, преподавали са ми, а това кой и защо е избрал платформата е друг въпрос.

Като казах че е сравнително нова, имах предвид J2EE като платформа, а не Java, за което се извинявам.

Не коментирам какъв нет имат, нито бюджета, това е ясно.

Link to comment
Share on other sites

Archived

This topic is now archived and is closed to further replies.


×
×
  • Create New...