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

    +30

    1. 01
    2. 02
    3. 03
    4. 04
    5. 05
    6. 06
    7. 07
    8. 08
    9. 09
    10. 10
    11. 11
    12. 12
    13. 13
    14. 14
    15. 15
    16. 16
    17. 17
    18. 18
    19. 19
    20. 20
    21. 21
    22. 22
    23. 23
    24. 24
    25. 25
    26. 26
    27. 27
    class MakeBARCODE
        {
            public static string MakeEAN13(long prefix, long code)
            {
                //В случае если префикс или код слишком большие то будет выдана ошибка:
                string result = "ERROR_TOOLONG";
                if ((prefix < 100) && (code < 10000000000))
                {
                    //Получаем строку символов (цифр).
                    long all_code = prefix * 100000000000 + code;
                    string nabor = all_code.ToString();
                    //Сумма по чётным позициям.
                    int count_chet = int.Parse(nabor[1].ToString()) + int.Parse(nabor[3].ToString()) + int.Parse(nabor[5].ToString()) + int.Parse(nabor[7].ToString()) + int.Parse(nabor[9].ToString()) + int.Parse(nabor[11].ToString());
                    //Сумма по нечётным позициям.
                    int count_nechet = int.Parse(nabor[0].ToString()) + int.Parse(nabor[2].ToString()) + int.Parse(nabor[4].ToString()) + int.Parse(nabor[6].ToString()) + int.Parse(nabor[8].ToString()) + int.Parse(nabor[10].ToString());
                    //Контрольная сумма и контрольный разряд.
                    int control_summ = count_chet * 3 + count_nechet;
                    int ostatok = control_summ % 10;
                    if (!(ostatok == 0))
                    {
                        ostatok = 10 - ostatok;
                    }
                    result = nabor + ostatok.ToString();
                }
                return result;
            }
        }

    Наткнулся сегодня в интернетах на алгоритм расчета контрольной суммы EAN.

    Запостил: kovyl2404, 01 Сентября 2012

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

    • Это C#, а не C++
      Ответить
      • guest, установленный порядок нарушаете.
        Где здесь C++, @kovyl2404?
        Ответить
        • А ебись-провались. Ночью вчера постил... Не заметил, как промахнулся. Хотя, вроде шарп выбирал. Пардоньте...
          Ответить
        • По стандарту там еще восклицательный знак в конце должен быть.
          Ответить
    • > контрольный разряд
      обоймы
      Ответить
    • Эпичное выделение цифры по позиции. В одной из книг по шарпу видел алгоритм переворачивания цифр числа через ToString(), Reverse() и Parse().
      Ответить
      • Кстати, почему бы и нет?
        Ответить
        • Наверное, потому, что на для выделения каждого очередного символа, вы заново вызываете ToString(). Это не круто.
          Ответить
          • Если я, конечно, правильно понял, что имел в виду absolut.
            Ответить
          • Скорее всего @absolut имел в виду что-то типа (псевдокод, т.к. библиотеки шарпа я знаю плоховато):
            a = Integer.parse(a.toString().reverse())
            А правильное и шустрое решение будет примерно таким:
            int result = 0;
            while (a) {
                result = result * 10 + a % 10;
                a /= 10;
            }
            return result;
            Ответить
            • Наверное (с точностью до регистра), только в точности так оно не работает... =(

              http://ideone.com/OAC61 - а это уже все равно не так кратко и наглядно.
              Ответить
      • Не оптимально, зато очень кратко и для решения некоторых задач подойдёт.
        Ответить
      • x.ToString().AssParallel().Reverse().Parse()
        Ответить

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