Матч 396, Проверка
кредитной карты (VerifyCreditCard)
Дивизион 2, Уровень 1
Требуется реализовать алгоритм, проверяющий
корректность номера кредитной карты. Алгоритм имеет следующий вид:
1. Отделим цифры кредитной карты друг от друга.
Например, из “
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;
}
};