Я сейчас изо всех сил пытаюсь решить вопрос. Однако я столкнулся со следующей проблемой:
После проверки суммы я хочу проверить первые 2 цифры номера карты. поэтому я использую следующий метод:
int main(void)
{
long long ccn;
do
{
ccn = get_long_long("Credit Card No.:\n");
}
while (ccn < 0);
int ccn_len;
long long count = ccn;
long long bccn = ccn;
for (ccn_len = 0; count != 0; ccn_len++, count /= 10);
int sum = 0; //checksum
for (int i = 0; i < ccn_len; ccn /= 10, i++)
{
if (i % 2 == 0)
{
sum += ccn % 10;
}
else
{
int digit = (ccn % 10) * 2;
sum += digit / 10 + digit % 10;
}
}
if (sum % 10 != 0)
{
printf("INVALID");
}
else
{
int a = bccn / 1e13;
if ((bccn / 1e13 == 34 || bccn / 1e13 == 37) && ccn_len == 15)
{
printf("AMERICAN EXPRESS");
}
else if (bccn / 1e12 == 4 && ccn_len == 13)
{
printf("VISA");
}
else if (ccn_len == 16)
{
if (bccn / 1e15 == 4)
{
printf("VISA");
}
if (bccn / 1e14 > 50 || bccn / 1e14 < 56)
{
printf("MASTERCARD");
}
}
else
{
printf("INVALID");
}
}
}
}
Допустим, это действующая карта AE: 378282246310005 с длиной 15 цифр
В приведенном выше коде я использую ccn / 1e13, чтобы получить первые две цифры, чтобы проверить, 34 или 37.
Однако после проверки контрольной суммы вывод все еще показывает INVALID.
Я пытаюсь использовать другой метод, я устанавливаю переменную a и a = ccn / 1e13, а затем я вставляю в оператор if:
if ((a == 34 || a == 37) || ccn_len == 15)
на этот раз все работает нормально.
Кто-нибудь может сказать мне, что не так с моим кодом? Или как мне лучше писать?
Мы очень ценим ваши ответы.