Определить четность/нечетность числа.

Discussion in 'WASM.ZEN' started by _Juicy, Jan 27, 2011.

  1. _Juicy

    _Juicy Active Member

    Blog Posts:
    0
    Joined:
    Aug 12, 2003
    Messages:
    1,159
    Location:
    SPb
    Как определить четность числа типа real (т.е., нецелочисленный тип), без приведения к целому типу и использования остатка целочисленного деления?

    PS: или как из типа real получить тип integer, не пользуясь функцией trunc(). Есть тут знатоки паскаля?
     
  2. Black_mirror

    Black_mirror Active Member

    Blog Posts:
    0
    Joined:
    Oct 14, 2002
    Messages:
    1,035
    Squash
    А что вы хотите делать с дробными числами?
     
  3. KeSqueer

    KeSqueer Сергей

    Blog Posts:
    0
    Joined:
    Jul 19, 2007
    Messages:
    1,183
    Location:
    Москва
    Как можно определить чётность нецелого числа?
     
  4. _Juicy

    _Juicy Active Member

    Blog Posts:
    0
    Joined:
    Aug 12, 2003
    Messages:
    1,159
    Location:
    SPb
    Использовать в качестве показателя степени. Вообще говоря, смысла в этом никакого, просто у младшего братца преподаватель чудит. Кажется, взятку хочет, но пока мы идем на принцип.
     
  5. _Juicy

    _Juicy Active Member

    Blog Posts:
    0
    Joined:
    Aug 12, 2003
    Messages:
    1,159
    Location:
    SPb
    После точки - нули, т.е. оно целое, но целочисленное деление к нему не применить.
     
  6. rat4

    rat4 Member

    Blog Posts:
    0
    Joined:
    Sep 13, 2005
    Messages:
    30
    Code (Text):
    1. #include <stdio.h>
    2. #include <math.h>
    3.  
    4. int main()
    5. {
    6. double i = 7;
    7. i = fabs( i/2 );
    8. while ( --i > 0 );
    9. printf("\n %f \n",i);
    10. if ( i == 0 )
    11. printf ("1\n");
    12. else if ( i == -0.5 )
    13. printf ("2\n");
    14. else
    15. printf ("3\n");
    16. }
    Сойдёт? :)
     
  7. KeSqueer

    KeSqueer Сергей

    Blog Posts:
    0
    Joined:
    Jul 19, 2007
    Messages:
    1,183
    Location:
    Москва
    Не буду утверждать, что это неверно в общем случае.

    Нельзя делить - умножьте на 0,5 и сравните дробную часть по модулю с eps = 0,00...1.
     
  8. _Juicy

    _Juicy Active Member

    Blog Posts:
    0
    Joined:
    Aug 12, 2003
    Messages:
    1,159
    Location:
    SPb
    rat4

    Гениально. Спасибо!
     
  9. Booster

    Booster New Member

    Blog Posts:
    0
    Joined:
    Nov 26, 2004
    Messages:
    4,860
    Squash
    Вообще достаточно проверить один бит. Какой, надеюсь сами вычислите.
     
  10. _Juicy

    _Juicy Active Member

    Blog Posts:
    0
    Joined:
    Aug 12, 2003
    Messages:
    1,159
    Location:
    SPb
    Паскаль, первый курс... Препода удар может хватить.
     
  11. Mikl___

    Mikl___ Супермодератор Staff Member

    Blog Posts:
    14
    Joined:
    Jun 25, 2008
    Messages:
    3,914
    Squash
    Тему в HEAP или в BEGINNERS WASM.ZEN совсем не для этого, ТС нужно было хотя бы пару тем почитать в этой ветке прежде, чем создавать сообщение
     
  12. _Juicy

    _Juicy Active Member

    Blog Posts:
    0
    Joined:
    Aug 12, 2003
    Messages:
    1,159
    Location:
    SPb
  13. _sheva740

    _sheva740 New Member

    Blog Posts:
    0
    Joined:
    Aug 31, 2005
    Messages:
    1,539
    Location:
    Poland
    Squash
    Если предмет профилирующий, то лучше платить.
    Все равно на последующих курсах с этим преподом еще не раз встретишься :dntknw:

    Вообще в таких ситуациях нужно спрашивать так:
    "Как себя вести на лентах чтобы пофиг было четное число или нет?" )))
     
  14. l_inc

    l_inc New Member

    Blog Posts:
    0
    Joined:
    Sep 29, 2005
    Messages:
    2,566
    Booster
    Если намёк на двоичное представление double, то недостаточно. Надо найти номер последнего значащего бита мантиссы (начиная с неявной единицы на условно нулевой позиции) и проверить, не превышает ли он разность между значением в поле порядка и базой (1023 для double). Если разность больше, то число чётное. Нуль надо вообще обрабатывать особым образом. В общем случае учитывать надо все биты представления.
     
  15. Rockphorr

    Rockphorr Well-Known Member

    Blog Posts:
    0
    Joined:
    Jun 9, 2004
    Messages:
    2,625
    Location:
    Russia
    Squash
    ну если это только проблема найти еще какую-нить функцию пасквиля, то справочник по пасквилю поможет вам быстрее чем форум по низкоуровневому проганью

    понятие четность для не целых чисел не определено, более того для больших чисел как например число Авогадро 6.02 * 10^23 или скорость света в ангстремах в секунду последние знаки представляют весьма малый интерес
     
  16. Black_mirror

    Black_mirror Active Member

    Blog Posts:
    0
    Joined:
    Oct 14, 2002
    Messages:
    1,035
    Squash
    Можно проверить так
    if Fraq(x/2.0)<0.5 then чётное
     
  17. _Juicy

    _Juicy Active Member

    Blog Posts:
    0
    Joined:
    Aug 12, 2003
    Messages:
    1,159
    Location:
    SPb
    Black_mirror
    Наверное, Frac?
    Если преподавателя не устроил Trunc, то вряд ли есть смысл подсовывать ему аналоги.
     
  18. Black_mirror

    Black_mirror Active Member

    Blog Posts:
    0
    Joined:
    Oct 14, 2002
    Messages:
    1,035
    Для чисел типа double больших чем единица бит соответствующий единице можно проверить так:
    double x1=x+1;
    int64 m=(*(int64*)&x1)^(*(int64*)&x);
    if(m&(m-1)==0)
    чётное;
    else
    нет;
     
  19. l_inc

    l_inc New Member

    Blog Posts:
    0
    Joined:
    Sep 29, 2005
    Messages:
    2,566
    Black_mirror
    Уверены, что будет работать для чисел больших 2^53? :)
     
  20. Black_mirror

    Black_mirror Active Member

    Blog Posts:
    0
    Joined:
    Oct 14, 2002
    Messages:
    1,035
    l_inc
    Для них x+1==x, значит m==0 и m&(m-1)==0.