1. C++ / Говнокод #4774

    +147

    1. 1
    2. 2
    3. 3
    4. 4
    5. 5
    6. 6
    7. 7
    8. 8
    9. 9
    int count(int a)
    {
        int cnt=0;
        while(a)
        {
             ++cnt;
        }
        return cnt;
    }

    Ф-ция для подсчета количества знаков числа. Взято с www.cyberforum.ru

    Запостил: psina-from-ua, 28 Ноября 2010

    Комментарии (38) RSS

    • М.б. имелось ввиду
      while(--a)
      {
           ++cnt;
      }
      Ответить
      • while(a) {
        ++cnt;
        a /= BASE;
        }
        Ответить
      • Ха-ха. Может сразу cnt = a - 1; ? :) и то только для положительных.
        Код из ГК вообще будет циклиться.
        Ответить
    • По-моему здесь не хватает деления на 10 (или, как написал burdakovd, на основание) .
      Кроме пропущенного деления я таки не вижу ничего интересного :(
      Ответить
      • почему деления? если уж решать в лоб - вычитания!
        Ответить
        • количество знаков, которое занимает число определять вычитанием, это как ?
          Ответить
          • Деление можно заменить циклическим вычитанием, тогда у нас будет ещё один вложенный цикл.
            Ответить
            • это уже не в лоб тогда, а через опу.
              Ответить
              • надо быть последовательным, если логарифм заменять циклом с делением, то и деление нужно заменять вычитанием :)
                Ответить
                • Тогда уж и вычитание заменить последовательными декрементами, будет третий цикл.
                  А декремент расписать как цепочку битовых операций.
                  Ответить
                • Интересно, что делением получилось в ~2,3 раза быстрее, чем log10().
                  Ответить
                  • Интересно! А я как-то не догадался проверить...
                    Ответить
                  • делением чего? что быстрее: медленная константа или быстрый логарифм?
                    Ответить
                    • Делением чего угодно, в силу того, что целочисленная арифметика быстрее плавающей точки.
                      Ответить
                      • еще раз

                        что больше: N маленьких пальцев или 1 большой (тоже палец)?
                        Ответить
                        • Зависит от N и от определений "маленький" и "большой".
                          Ответить
                          • N произвольное натуральное
                            большой > маленького, но такой, что влезает в O(X) :-)

                            в одной ветке обсуждается просирание константы, в другой ненужность образования, нельзя же так.

                            пруф: http://govnokod.ru/4805
                            Ответить
                  • да тут вообще извращенцы, я бы не догадался log10() использовать
                    Ответить
                  • да? даже для 8-значных чисел?
                    и еще, log10 что из себя представляет в вашей реализации?
                    может лучше
                    1 раз посчитать ln10 = log(10);
                    и при каждом вызове делать log(a)/ln10;
                    Ответить
                    • Хм-м ... проверил в VS2010. log10() оказался ~4,4 раза быстрее рукописного.
                      Ответить
                    • Могу предположить, что логарифм для компутера — это многочлен, являющийся обрубком ряда Тейлора, а log10 от log отличается коэффициентами, поэтому скорость log и log10 будет одинаковой, а лишнего деления во втором случае не будет. То есть log10 предпочтительнее.
                      Ответить
                  • где получилось?)
                    на каком компиляторе?
                    Ответить
    • Есть для подсчета кол-ва установленных битов в числе интересный код:
      int cnt; 
      for( cnt=0; value; ++cnt )
         value ^= value & -value;
      Ответить
      • http://www.solkcit.edusite.ru/DswMedia/rayonnayaolimpiadapoinformatike.doc
        подсуньте этому товарищу задачу №4 из данного файла. Где-то еще я видел тесты к ней :) в крайнем случае закину сам куда-нибудь.
        Ответить
      • Если на то пошло есть и более интересные решения)
        Ответить
    • Ошибка редактора или кого-то еще, кто тупо перепечатывал.
      в 2000-м видел объявление "Работа программистом на С, С+, С++", сходил к ним, чтобы посмотреть на них - вполне адекватные люди.
      Ответить
      • надо было представиться спецом по C+ но быстрообучаемым :D
        Ответить
      • это какой-нибудь программист-химик ... работа с углеродом и его положительно заряженными ионами (0,1,2...)
        Ответить
      • а у нас в метро висела реклама:
        "обучение созданию сайтов: html, java, 3dmax"
        Ответить
    • Может автор хотел узнать сколько раз выполнится цикл пока другой поток не об0ит а.
      Ответить
      • a передаётся по значению и к тому же не volatile
        Ответить
        • блин, точно, а хотелось придумать приминение )
          Ответить

    Добавить комментарий