В настоящее время я прохожу онлайн-курс CS50 и застрял на втором упражненииЦель состоит в том, чтобы в качестве входных данных указать номер кредитной карты (или любой другой номер) и получить выходные данные как недействительные или как одну из трех основных кредитных карт (Master, Visa или AmEx).
Мой код работаетпочти так, как я хотел, в том, что я получаю правильный вывод, моя проблема в том, что он в неправильном формате.
Если я введу номер не кредитной карты вместо
INVALID
мой вывод выглядит следующим образом:
INVALID INVALID INVALID INVALID INVALID
если я даю номер кредитной карты AmEx в качестве ввода, мой вывод выглядит следующим образом:
INVALIDAmEx INVALID INVALID INVALID
Это мой код:
int main(void)
{
long long CreditCardNo;
do
{
CreditCardNo = get_long_long("Enter credit card number:");
}
while (CreditCardNo <= 0);
int countDigits = 0;
long long count = CreditCardNo;
//run loop until number is no longer an integer
while (count != 0)
{
//Incremental counter
countDigits++;
//Divide input number by 10 to reduce one digit from integer
count = count / 10;
}
//return "Invalid" for all numbers with any amount of digits other than 13, 15 & 16
if (countDigits != 13 && countDigits != 15 && countDigits != 16)
{
printf("INVALID\n");
}
//Take 2nd to last digit, and then the every other digit, and multiply by 2 to get the first part for the checksum
int digit1 = (((CreditCardNo / 10) % 10) * 2);
int digit2 = (((CreditCardNo / 1000) % 10) * 2);
int digit3 = (((CreditCardNo / 100000) % 10) * 2);
int digit4 = (((CreditCardNo / 10000000) % 10) * 2);
int digit5 = (((CreditCardNo / 1000000000) % 10) * 2);
int digit6 = (((CreditCardNo / 100000000000) % 10) * 2);
int digit7 = (((CreditCardNo / 10000000000000) % 10) * 2);
int digit8 = (((CreditCardNo / 1000000000000000) % 10) * 2);
//Take last digit and then every other to get the second part for the checksum
int digit9 = (CreditCardNo % 10);
int digit10 = ((CreditCardNo % 1000) / 100);
int digit11 = ((CreditCardNo % 100000) / 10000);
int digit12 = ((CreditCardNo % 10000000) / 1000000);
int digit13 = ((CreditCardNo % 1000000000) / 100000000);
int digit14 = ((CreditCardNo % 100000000000) / 10000000000);
int digit15 = ((CreditCardNo % 10000000000000) / 1000000000000);
int digit16 = ((CreditCardNo % 1000000000000000) / 100000000000000);
//Add all digits for first checksum
int check1 = digit1 + digit2 + digit3 + digit4 + digit5 + digit6 + digit7 + digit8;
//Add all digits for second checksum
int check2 = digit9 + digit10 + digit11 + digit12 + digit13 + digit14 + digit15 + digit16;
//Add checksums
int check3 = check1 + check2;
//If checksum doesn't end in 0 return invalid
if (check3 % 10 != 0)
{
printf("INVALID\n");
}
//Validation for AmEx
int CheckAmex = CreditCardNo / 10000000000000;
if (CheckAmex != 34 && CheckAmex != 37)
{
printf("INVALID\n");
}
else
{
printf("AMEX\n");
}
//Validation for MasterCard
int CheckMasterCard = CreditCardNo / 100000000000000;
if (CheckMasterCard != 51 && CheckMasterCard != 52 && CheckMasterCard != 53 && CheckMasterCard != 54 && CheckMasterCard != 55)
{
printf("INVALID\n");
}
else
{
printf("AMEX\n");
}
//Validation for Visa
int CheckVisa1 = CreditCardNo / 1000000000000;
if (CheckVisa1 != 4)
{
printf("INVALID\n");
}
else
{
printf("Visa\n");
}
int CheckVisa2 = CreditCardNo / 1000000000000000;
if (CheckVisa1 != 4)
{
printf("INVALID\n");
}
else
{
printf("Visa\n");
}
}
Я пытался переупаковать самую первую формулу if в else и наложить остальные на эту первую, но я не могупохоже, он работает, так как я получаю новые ошибки по типу «необъявленного идентификатора« CheckMasterCard »(или Visa, или вообще чего-то еще).
Есть ли простое решение, которое я пропускаю иМожно осуществить легко, или мне нужно переделать все это?