Матч 396, Проверка кредитной карты (VerifyCreditCard)

Дивизион 2, Уровень 1

 

Требуется реализовать алгоритм, проверяющий корректность номера кредитной карты. Алгоритм имеет следующий вид:

1. Отделим цифры кредитной карты друг от друга. Например, из “123” получим набор цифр {1, 2, 3}.

2. Если номер кредитной карты содержит четное количество цифр, то умножаем каждую цифру, стоящую на нечетной позиции, на 2. Иначе на 2 умножаем каждую цифру, стоящую на четной позиции. Позиции нумеруются с 1.

3. Находим сумму всех цифр. Для двузначных чисел к сумме прибавляем число десятков и единиц.

Если полученная сумма цифр делится на 10, то номер кредитной карты является действительным, иначе – нет. По строке cardNumber, содержащей число, необходимо определить, является ли оно действительным номером  кредитной карты.

 

Класс: VerifyCreditCard

Метод: string checkDigits(string cardNumber)

Ограничения: cardNumber содержит от 1 до 50 символов ‘0’ – ‘9’.

 

Вход. Строка cardNumber, содержащая номер кредитной карты.

 

Выход. Слово "VALID" или "INVALID" в зависимости от того, является ли номер входной кредитной карты действительным.

 

Пример входа

cardNumber

"21378"

"11111101"

"542987223412"

 

Пример выхода

"VALID"

"VALID"

"INVALID"

 

 

РЕШЕНИЕ

элементарный вычисления

 

Занесем все цифры кредитной карты в массив v. В зависимости от четности размера массива v выполняем удвоение четных или нечетных цифр. В переменной s находим сумму всех цифр, используя функцию sumdigit. Функция sumdigit(d)находит сумму цифр числа d.

 

ПРОГРАММА

 

#include <cstdio>

#include <string>

#include <vector>

using namespace std;

 

int sumdigit(int d)

{

  return (d < 10) ? d : d%10 + sumdigit(d/10);

}

 

class VerifyCreditCard

{

public:

  string checkDigits(string cardNumber)

  {

    vector<int> v;

    string res;

    int s, i;

    for(i = 0; i < cardNumber.size(); i++) v.push_back(cardNumber[i] - '0');

    if (v.size() % 2) // odd

      for(i = 1; i < v.size(); i += 2) v[i] *= 2;

    else              // even

      for(i = 0; i < v.size(); i += 2) v[i] *= 2;

    for(s = i = 0; i < v.size(); i++) s += sumdigit(v[i]);

    if (s % 10) res = "INVALID"; else res = "VALID";

    return res;

  }

};