Russian Qt Forum
Май 02, 2024, 01:57 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
 
  Начало   Форум  WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  

Страниц: [1]   Вниз
  Печать  
Автор Тема: Алгоритм Луна / Luhn algorithm  (Прочитано 4290 раз)
gil9red
Administrator
Джедай : наставник для всех
*****
Offline Offline

Сообщений: 1805



Просмотр профиля WWW
« : Апрель 28, 2014, 21:56 »

Попав под "вики-эффект" наткнулся на статью про этот алгоритм и захотелось сделать Улыбающийся

Код:
#ifndef LUHNALGORITHM_H
#define LUHNALGORITHM_H

#include <QString>
#include <QVector>

class LuhnAlgorithm
{
public:
    LuhnAlgorithm( const QString & n = "" );
    LuhnAlgorithm & execute();
    LuhnAlgorithm & execute(const QString & number );
    int getSum() const;
    bool isValid() const;

    void setNumberCard( const QString & number );

    QVector < qint16 > getSequence();
    static QVector < qint16 > getSequence(const QString & numberCard );

private:
    QString numberCard;
    int sum;
    QVector < qint16 > digits;
    bool valid;
};
#endif // LUHNALGORITHM_H

Код:
#include "luhnalgorithm.h"

const int getSumSequence( const QVector < qint16 > & arr )
{
    int sum = 0;
    foreach ( qint16 n, arr )
        sum += n;

    return sum;
}

LuhnAlgorithm::LuhnAlgorithm( const QString & n )
    : sum(0), valid( false )
{
    setNumberCard( n );
}

LuhnAlgorithm &LuhnAlgorithm::execute()
{
    digits = getSequence( numberCard );
    sum = getSumSequence( digits );
    valid = sum % 10 == 0; // Если сумма кратна 10, тогда номер правильный

    return *this;
}
LuhnAlgorithm & LuhnAlgorithm::execute( const QString & number )
{
    setNumberCard( number );
    return execute();
}
int LuhnAlgorithm::getSum() const
{
    return sum;
}
bool LuhnAlgorithm::isValid() const
{
    return valid;
}

void LuhnAlgorithm::setNumberCard(const QString & number )
{
    numberCard = number;
    numberCard = numberCard.remove( ' ' );
}

QVector < qint16 > LuhnAlgorithm::getSequence()
{
    return digits;
}
QVector < qint16 > LuhnAlgorithm::getSequence( const QString & numberCard )
{
    // Алгоритм Луна
    // http://ru.wikipedia.org/wiki/%D0%90%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC_%D0%9B%D1%83%D0%BD%D0%B0
    //
    QVector < qint16 > array;
    const qint32 length = numberCard.length();
    for( qint32 i = 0; i < length; i++ )
    {
        qint16 digit = numberCard.at(i).digitValue();
        if ( i % 2 == 0 )
        {
            digit *= 2;
            digit = (digit > 9 ? digit - 9 : digit);
        }
        array << digit;
    }

    return array;
}

Использование:
Код:
QString num = "4561 2612 1234 5467";
LuhnAlgorithm & alg = LuhnAlgorithm( num ).execute();
qDebug() << num << "sum =" << alg.getSum() << "valid =" << alg.isValid();

num = "4561 2612 1234 5464";
alg = LuhnAlgorithm().execute( num );
qDebug() << num << "sum =" << alg.getSum() << "valid =" << alg.isValid();

qDebug() << "sequence =" << LuhnAlgorithm( "4561 2612 1234 5467" ).execute().getSequence();


"4561 2612 1234 5467" sum = 60 valid = true
"4561 2612 1234 5464" sum = 57 valid = false
sequence = QVector(8, 5, 3, 1, 4, 6, 2, 2, 2, 2, 6, 4, 1, 4, 3, 7)


Исходники с гуи
« Последнее редактирование: Апрель 28, 2014, 22:04 от gil9red » Записан

OKTA
Гость
« Ответ #1 : Апрель 29, 2014, 10:07 »

Попади под вот этот вики-эффект  Смеющийся
http://ru.wikipedia.org/wiki/ASN.1
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


Страница сгенерирована за 0.043 секунд. Запросов: 22.