微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

CS50x 积分应为“无效\n”,而不是“VISA\n”

如何解决CS50x 积分应为“无效\n”,而不是“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。下一个循环不迭代。

for (i = 0; number > 0; i++,number /= 10)

代码需要保留number

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。