...

Тема в разделе "WASM.BEGINNERS", создана пользователем Katerina_11, 13 июн 2010.

  1. Katerina_11

    Katerina_11 New Member

    Публикаций:
    0
    Регистрация:
    13 июн 2010
    Сообщения:
    9
    Здравствуйте, помогите, пожалуйста, вычесть Короткое Целое из ОДЦ. ОченьДлинноеЦелое – неотрицательное число состоит из большого количества цифр (>100), так что операции с такими числами не поддерживаются ни в одном числовом типе данных. За рание спасибо!
     
  2. skomarov

    skomarov New Member

    Публикаций:
    0
    Регистрация:
    14 май 2008
    Сообщения:
    389
    Katerina_11
    Здравствуйте.
    1) ОДЦ следует задать в виде массива цифр.
    2) Затем надо перевести короткое целое в формат ОДЦ.
    3) Затем произвести вычитание по правилам арифметики.
     
  3. Rockphorr

    Rockphorr Well-Known Member

    Публикаций:
    0
    Регистрация:
    9 июн 2004
    Сообщения:
    2.625
    Адрес:
    Russia
    Katerina_11
    пишете цикл в котором орудуете инструкцией sbb по элементам массива как сказал skomarov
     
  4. Katerina_11

    Katerina_11 New Member

    Публикаций:
    0
    Регистрация:
    13 июн 2010
    Сообщения:
    9
    а как вы думаете, стоит ли узнать кол-во символов короткого целого, чтобы проще произвести операцию вычтанния?
     
  5. skomarov

    skomarov New Member

    Публикаций:
    0
    Регистрация:
    14 май 2008
    Сообщения:
    389
    Katerina_11
    В зависимости от компилятора, размер короткого целого равен либо 16 бит либо 32 бита. Соответственно, максимальное количество десятичных цифр короткого целого равно либо 5 цифр либо 10 цифр.
    Для вычисления потребуется узнать и кол-во цифр уменьшаемого и количество цифр вычитаемого.
     
  6. Katerina_11

    Katerina_11 New Member

    Публикаций:
    0
    Регистрация:
    13 июн 2010
    Сообщения:
    9
    просто если узнать кол-во цифр вычитаемого, то можно скопировать это кол-во с конца ОДЦ
     
  7. edemko

    edemko New Member

    Публикаций:
    0
    Регистрация:
    25 ноя 2009
    Сообщения:
    454
  8. Katerina_11

    Katerina_11 New Member

    Публикаций:
    0
    Регистрация:
    13 июн 2010
    Сообщения:
    9
    не могу открыть файл
     
  9. edemko

    edemko New Member

    Публикаций:
    0
    Регистрация:
    25 ноя 2009
    Сообщения:
    454
    Код (Text):
    1. format pe gui 4.0
    2.  
    3. /*
    4. d         = рaзрядов десятичных числа
    5. b         = разрядов двоичных числа для случая d
    6. 10^d-1 ~ 10^d = максимальное число для случая d
    7.  
    8. 10^d = 2^b
    9. b = log(2;10^d) = log(2;10)*d = 3.321*d
    10. 3.321*100 = 332 бит = 332/32 dword ~ 11 dword
    11.  
    12.  
    13.  
    14. */
    15.  
    16. одц1 dd $00000000,$00000000,$00000000,$00000000,$00000000,$00000000,$00000000,$00000000,$00000000,$80000000,$00000000
    17. одц2 dd $00000000,$00000000,$00000000,$00000000,$00000000,$00000000,$00000000,$00000000,$00000000,$80000000,$00000000
    18.  
    19. entry $
    20.     cld
    21.     mov ecx,11
    22.     mov esi,одц1
    23.     mov edi,одц2
    24.     clc
    25. .loop:  lodsd
    26.     adc eax,[edi]
    27.     stosd
    28.     loop    .loop
    29.  
    30.     ret
     
  10. Katerina_11

    Katerina_11 New Member

    Публикаций:
    0
    Регистрация:
    13 июн 2010
    Сообщения:
    9
    Спасибо!
     
  11. Katerina_11

    Katerina_11 New Member

    Публикаций:
    0
    Регистрация:
    13 июн 2010
    Сообщения:
    9
    попробую
     
  12. skomarov

    skomarov New Member

    Публикаций:
    0
    Регистрация:
    14 май 2008
    Сообщения:
    389
    Katerina_11
    Так делать нельзя, потому что может быть заимствование из более старших разрядов. Например, для максимального короткого целого (32 бита).
    Код (Text):
    1. Пример 1.
    2.  1 000 000 000 000 000 000 000 000 000
    3. -                        4 294 967 295
    4.  -------------------------------------
    5.    999 999 999 999 999 995 705 032 705
    6.  
    7. Пример 2.
    8.  1 000 000 000 001 000 000 000 000 000
    9. -                        4 294 967 295
    10.  -------------------------------------
    11.  1 000 000 000 000 999 995 705 032 705
     
  13. Katerina_11

    Katerina_11 New Member

    Публикаций:
    0
    Регистрация:
    13 июн 2010
    Сообщения:
    9
    это да, поэтому необходимо их сравнить, для заимствования
     
  14. skomarov

    skomarov New Member

    Публикаций:
    0
    Регистрация:
    14 май 2008
    Сообщения:
    389
    Katerina_11
    К тому же количество цифр ОченьДлинногоЦелого может быть меньше количества цифр короткого целого. Это не противоречит условию задачи.

    Код (Text):
    1.   2 005
    2.  14 278
    3. -------
    4. -12 273
     
  15. Katerina_11

    Katerina_11 New Member

    Публикаций:
    0
    Регистрация:
    13 июн 2010
    Сообщения:
    9
    не противоречит, но в данном случае не подразумевает, здесь просто нужно отнять, а размерность одц задается до 200 символов
     
  16. edemko

    edemko New Member

    Публикаций:
    0
    Регистрация:
    25 ноя 2009
    Сообщения:
    454
    Согласно хакерскому ржатнику http://manybooks.net/titles/raymondericetext02jarg422.html
    Код (Text):
    1. 1000! =
    2.      40238726007709377354370243392300398571937486421071
    3.      46325437999104299385123986290205920442084869694048
    4.      00479988610197196058631666872994808558901323829669
    5.      94459099742450408707375991882362772718873251977950
    6.      59509952761208749754624970436014182780946464962910
    7.      56393887437886487337119181045825783647849977012476
    8.      63288983595573543251318532395846307555740911426241
    9.      74743493475534286465766116677973966688202912073791
    10.      43853719588249808126867838374559731746136085379534
    11.      52422158659320192809087829730843139284440328123155
    12.      86110369768013573042161687476096758713483120254785
    13.      89320767169132448426236131412508780208000261683151
    14.      02734182797770478463586817016436502415369139828126
    15.      48102130927612448963599287051149649754199093422215
    16.      66832572080821333186116811553615836546984046708975
    17.      60290095053761647584772842188967964624494516076535
    18.      34081989013854424879849599533191017233555566021394
    19.      50399736280750137837615307127761926849034352625200
    20.      01588853514733161170210396817592151090778801939317
    21.      81141945452572238655414610628921879602238389714760
    22.      88506276862967146674697562911234082439208160153780
    23.      88989396451826324367161676217916890977991190375403
    24.      12746222899880051954444142820121873617459926429565
    25.      81746628302955570299024324153181617210465832036786
    26.      90611726015878352075151628422554026517048330422614
    27.      39742869330616908979684825901254583271682264580665
    28.      26769958652682272807075781391858178889652208164348
    29.      34482599326604336766017699961283186078838615027946
    30.      59551311565520360939881806121385586003014356945272
    31.      24206344631797460594682573103790084024432438465657
    32.      24501440282188525247093519062092902313649327349756
    33.      55139587205596542287497740114133469627154228458623
    34.      77387538230483865688976461927383814900140767310446
    35.      64025989949022222176590433990188601856652648506179
    36.      97023561938970178600408118897299183110211712298459
    37.      01641921068884387121855646124960798722908519296819
    38.      37238864261483965738229112312502418664935314397013
    39.      74285319266498753372189406942814341185201580141233
    40.      44828015051399694290153483077644569099073152433278
    41.      28826986460278986432113908350621709500259738986355
    42.      42771967428222487575867657523442202075736305694988
    43.      25087968928162753848863396909959826280956121450994
    44.      87170124451646126037902930912088908694202851064018
    45.      21543994571568059418727489980942547421735824010636
    46.      77404595741785160829230135358081840096996372524230
    47.      56085590370062427124341690900415369010593398383577
    48.      79394109700277534720000000000000000000000000000000
    49.      00000000000000000000000000000000000000000000000000
    50.      00000000000000000000000000000000000000000000000000
    51.      00000000000000000000000000000000000000000000000000
    52.      00000000000000000000000000000000000000000000000000
    53.      000000000000000000.
     
  17. skomarov

    skomarov New Member

    Публикаций:
    0
    Регистрация:
    14 май 2008
    Сообщения:
    389
    Katerina_11
    Сравнивать можно в процессе вычитания. Допустим, уже получены первое и второе число в формате ОДЦ. Цифры представляют собой символы ASCII '0'..'9'. Числа выравнены по правому краю, старшие незначащие позиции заполнены цифрой '0'. Результат вычислений записывается в таком же форме. Тогда алгоритм вычитания может быть таким. (Все перечисленные мной условия можно снять, но тогда программа усложняется дополнительными проверками, которые к алгоритму вычислений имеют косвенное отношение.)
    Код (Text):
    1. #define max 200
    2. char n1[max+1];
    3. char n2[max+1];
    4. char r[max+1];
    5. int i, j, k;
    6.  
    7. for(i = max-1; i >= 0; i--) {
    8.   z = 0;
    9.   if(n1[i] < n2[i]) {
    10.     z = 10;
    11.     for(j = i-1; j >= 0; j--) {
    12.       if(n1[j] > 0) {
    13.         n1[j]--;
    14.         break;
    15.       }
    16.     }
    17.     for(k = j+1; k <= i-1; k++) n1[k] = '9';
    18.   }
    19.   r[i] = '0' + (n1[i] + z) - n2[i];
    20. }
     
  18. skomarov

    skomarov New Member

    Публикаций:
    0
    Регистрация:
    14 май 2008
    Сообщения:
    389
    Katerina_11
    Циклы j и k лучше объединить.
    Код (Text):
    1.     for(j = i-1; j >= 0; j--) {
    2.       if(n1[j] > 0) {
    3.         n1[j]--;
    4.         break;
    5.       }
    6.       n1[j] = '9';
    7.     }
     
  19. Katerina_11

    Katerina_11 New Member

    Публикаций:
    0
    Регистрация:
    13 июн 2010
    Сообщения:
    9
    интересно... буду разбираться, спасибо