Проверка на счастливое число в Си

Discussion in 'С/С++, C#, Rust, Swift, Go, Java, Perl, Ruby' started by Raine, 10 Mar 2011.

  1. Raine

    Raine New Member

    Joined:
    14 Feb 2010
    Messages:
    39
    Likes Received:
    0
    Reputations:
    0
    В общем вводят 6 значное число. Если сумма первых трёх равна сумме последних трёх то число счастливое. Проблема в том, что я не знаю как 6 значное число разделить на 6 чисел. Кто подскажет, как это делается?
     
  2. arnis

    arnis Member

    Joined:
    30 Jan 2011
    Messages:
    280
    Likes Received:
    23
    Reputations:
    0
    делением на 10, 100, 1000 и тд .
    Поучай знаки и слажевай.
     
  3. maked0n

    maked0n New Member

    Joined:
    14 Sep 2010
    Messages:
    144
    Likes Received:
    3
    Reputations:
    0
    или остатком от деления %
    ну там если у тебя число 123123
    ты делаешь
    int myNum = 123123;
    int firstNums = myNum / 1000;
    if((myNum % 1000) == firstNums)
    {
    //TODO: твой код
    }
     
    1 person likes this.
  4. Cock3r

    Cock3r New Member

    Joined:
    19 Jan 2011
    Messages:
    14
    Likes Received:
    3
    Reputations:
    0
    можно по-быдловскому, преобразовать всё число в string и сравнивать преобразованные в integer части
     
  5. mailbrush

    mailbrush Well-Known Member

    Joined:
    24 Jun 2008
    Messages:
    1,997
    Likes Received:
    996
    Reputations:
    155
    o_O... Ну вы извращенцы)))

    ТС, юзай =)

    http://www.cplusplus.com/reference/clibrary/cstdlib/itoa/
    Code:
     int i = 123321;
     char buf[6];
    
     itoa(i, buf, 10);
    
     if(buf[0] + buf[1] + buf[2] == buf[3] + buf[4] + buf[5])
      printf("%s", "that's happy num =)");
    
     
    1 person likes this.
  6. maked0n

    maked0n New Member

    Joined:
    14 Sep 2010
    Messages:
    144
    Likes Received:
    3
    Reputations:
    0
    Ну можно и так)
     
  7. Raine

    Raine New Member

    Joined:
    14 Feb 2010
    Messages:
    39
    Likes Received:
    0
    Reputations:
    0
    mailbrush а что за ф-ция itoa? В первом параметре число, во втором я так понял массив, а 10 это что?
     
  8. Cock3r

    Cock3r New Member

    Joined:
    19 Jan 2011
    Messages:
    14
    Likes Received:
    3
    Reputations:
    0

    он же дал тебе ссылку
    http://www.cplusplus.com/reference/clibrary/cstdlib/itoa/


    char * itoa ( int value, char * str, int base );
    Numerical base used to represent the value as a string, between 2 and 36, where 10 means decimal base, 16 hexadecimal, 8 octal, and 2 binary.

    [wiki]Аргумент radix(base в первом случае) определяет основание системы исчисления для input(value); его значение может лежать в пределах от 2 до 36.[/wiki]
     
  9. Raine

    Raine New Member

    Joined:
    14 Feb 2010
    Messages:
    39
    Likes Received:
    0
    Reputations:
    0
    извените, я как английский увидел так сразу закрыл браузер)
     
  10. KoF31n

    KoF31n New Member

    Joined:
    29 Nov 2010
    Messages:
    49
    Likes Received:
    1
    Reputations:
    0
    А на pascal/delphi как будет?:)
     
  11. arnis

    arnis Member

    Joined:
    30 Jan 2011
    Messages:
    280
    Likes Received:
    23
    Reputations:
    0
    ну я бы реализовал так:
    var
    s:string
    begin
    S:='123321';
    if IntTostr(s[1])+IntTostr(s[2])+IntTostr(s[3])=IntTostr(s[4])+IntTostr(s[5])+IntTostr(s[6]) then
    showmessage('Счастливое число!!!') else showmessage('Нет не счастливое :(');
    end;
     
  12. slesh

    slesh Elder - Старейшина

    Joined:
    5 Mar 2007
    Messages:
    2,702
    Likes Received:
    1,224
    Reputations:
    455
    2 arnis нах такие вычисления жестокие? Можно напрямую работать с кодами символов, тут же важно совпадение суммы, а не конкретное её значение.

    if ord(s[1]) + ord(s[2]) + ord(s[3]) = ord(s[4]) + ord(s[5]) + ord(s[6]) then
    showmessage('Счастливое число!!!') else showmessage('Нет не счастливое ');

    А вообще можно сделать универсальным это. Для любого числа с четным кол-вом знаков будет давать результат.
    Code:
    ret := 0;
    stop :=  length(s) shr 1;
    
    for x := 1 to stop do
    begin
     ret := ret + ord(s[x]) - ord(s[x + stop]);
    end;
    
    if ret = 0 then Счастливое
    
     
  13. arnis

    arnis Member

    Joined:
    30 Jan 2011
    Messages:
    280
    Likes Received:
    23
    Reputations:
    0
    Тоже код имеет право на жизнь.
    Но такой вариант деления как ты предложил сейчас породит кучу вопросов а что делает эта строка.
    Писалось чтобы было понятно тем кто только начал писать.
     
  14. Raine

    Raine New Member

    Joined:
    14 Feb 2010
    Messages:
    39
    Likes Received:
    0
    Reputations:
    0
    я дописал вариант mailbrush, чтобы он выводит все счастливые числа. Делал через цикл фор от 100000 до 999999. Когда программа запускается, видно как бегут числа начиная от 2***** а когда перебор заканчивается, я консоль вверх листаю и дохожу ток до цифр от 8*****. Почему так? Я же видел цифры меньше при работе программы
     
  15. AlexTheC0d3r

    AlexTheC0d3r Elder - Старейшина

    Joined:
    25 Jul 2008
    Messages:
    388
    Likes Received:
    179
    Reputations:
    18

    ПОТОМУ ЧТО ЭТО КОНСОЛЬ!!!!!
     
  16. Ins3t

    Ins3t Харьковчанин

    Joined:
    18 Jul 2009
    Messages:
    939
    Likes Received:
    429
    Reputations:
    139
    Raine
    Эта проблема решаема.
    http://msdn.microsoft.com/en-us/library/ms682073(v=vs.85).aspx
     
    1 person likes this.