(CS50x 信用)预期 "INVALID\n",而不是 "VISA\n"
(CS50x Credit) expected "INVALID\n", not "VISA\n"
任务:用户输入卡号,需要判断卡是否有效,如果有效,判断卡的类型(Visa、MasterCard、American Express)。我们有[https://cs50.harvard.edu/college/2021/spring/psets/1/credit/#luhns-algorithm][Luhn's Algorithm]来确定卡号的有效性。
问题:有时程序将无效卡识别为 Visa(例如:4111111111111113、4222222222223)。我真的不知道如何解决这个问题(我已经看到了这个 CS50 Credit 任务的其他解决方案,但由于我是初学者,我想知道这段代码到底出了什么问题。我将不胜感激关于此问题和整个代码的提示。感谢您的帮助!
#include <cs50.h>
#include <stdio.h>
#include <math.h>
int main(void)
{
long credit;
do
{
credit = get_long("Number of card:\n");
}
while (credit < 0);
long number = credit;
int digits;
for (digits = 0; number > 0; digits++)
{
number /= 10;
}
int checksum = 0;
int i;
for (i = 0; number > 0; i++, number /= 10)
{
if (i % 2 == 0)
{
checksum += (number % 10);
}
else
{
int n = (number % 10) * 2;
if (n > 9)
{
n = (n / 10) + (n % 10);
}
checksum += n;
}
}
checksum = checksum % 10;
if ((checksum == 0) && ((credit >= 34e13 && credit < 35e13) || (credit >= 37e13 && credit < 38e13)))
{
printf("AMEX\n");
}
else if ((checksum == 0) && (credit >= 51e14 && credit < 56e14))
{
printf("MASTERCARD\n");
}
else if ((checksum == 0) && ((credit >= 4e12 && credit < 5e12) || (credit >= 4e15 && credit < 5e15)))
{
printf("VISA\n");
}
else
{
printf("INVALID\n");
}
}
代码更改 number
for (digits = 0; number > 0; digits++) {
number /= 10;
}
int checksum = 0;
int i;
考虑上述循环后number
的值。肯定是0。next循环不迭代。
for (i = 0; number > 0; i++, number /= 10)
代码需要保存 number
.
任务:用户输入卡号,需要判断卡是否有效,如果有效,判断卡的类型(Visa、MasterCard、American Express)。我们有[https://cs50.harvard.edu/college/2021/spring/psets/1/credit/#luhns-algorithm][Luhn's Algorithm]来确定卡号的有效性。
问题:有时程序将无效卡识别为 Visa(例如:4111111111111113、4222222222223)。我真的不知道如何解决这个问题(我已经看到了这个 CS50 Credit 任务的其他解决方案,但由于我是初学者,我想知道这段代码到底出了什么问题。我将不胜感激关于此问题和整个代码的提示。感谢您的帮助!
#include <cs50.h>
#include <stdio.h>
#include <math.h>
int main(void)
{
long credit;
do
{
credit = get_long("Number of card:\n");
}
while (credit < 0);
long number = credit;
int digits;
for (digits = 0; number > 0; digits++)
{
number /= 10;
}
int checksum = 0;
int i;
for (i = 0; number > 0; i++, number /= 10)
{
if (i % 2 == 0)
{
checksum += (number % 10);
}
else
{
int n = (number % 10) * 2;
if (n > 9)
{
n = (n / 10) + (n % 10);
}
checksum += n;
}
}
checksum = checksum % 10;
if ((checksum == 0) && ((credit >= 34e13 && credit < 35e13) || (credit >= 37e13 && credit < 38e13)))
{
printf("AMEX\n");
}
else if ((checksum == 0) && (credit >= 51e14 && credit < 56e14))
{
printf("MASTERCARD\n");
}
else if ((checksum == 0) && ((credit >= 4e12 && credit < 5e12) || (credit >= 4e15 && credit < 5e15)))
{
printf("VISA\n");
}
else
{
printf("INVALID\n");
}
}
代码更改 number
for (digits = 0; number > 0; digits++) {
number /= 10;
}
int checksum = 0;
int i;
考虑上述循环后number
的值。肯定是0。next循环不迭代。
for (i = 0; number > 0; i++, number /= 10)
代码需要保存 number
.