CS50问题集1功劳-找不到逻辑错误

问题描述 投票:0回答:2

[当我输入一个有效的信用卡号时,它应该输出信用卡品牌时输出“ INVALID”。我相信有效性功能出了点问题,但我似乎无法弄清楚是什么。我花了几个小时试图解决问题,但没有任何效果。如果能得到一些帮助,那就太好了,非常感谢!

这是我的代码:

#include <stdio.h>
#include <cs50.h>

bool validity(long long creditNum);
int find_length(long long n);
bool checksum(long long ccn);
void credit_card_num(long long ccn);

int main(void)
{
    long long creditNum;
    do
    {
    creditNum = get_long_long("Enter Card Number: ");
    }
    while(creditNum < 0);

    if (validity(creditNum) == true)
        credit_card_num(creditNum);
    else
        printf("INVALID\n");
}

bool validity(long long creditNum)
{
    int length = find_length(creditNum);
    if ((length == 13 || length == 15 || length == 16) && checksum(creditNum))
       return true;
    else
       return false;  
}

int find_length(long long n)
{
    int length;
    for (length = 0; n != 0; n/= 10)
    length++;
    return length;
}

bool checksum(long long ccn)
{
    int sum = 0;
    int digit;
    for (int i = 0; ccn != 0; i++, ccn /= 10)
    {
        if (i % 2 == 0)
           sum += ccn % 10;
        else
        digit = 2 * (ccn % 10);
        sum += digit / 10 + digit % 10;
    }
    if ((sum % 10) == 0)
       return true;
    else
       return false;
}

void credit_card_num(long long ccn)
{
    if ((ccn >= 34e13 && ccn < 35e13) || (ccn >= 37e13 && ccn < 38e13))
        printf("AMEX\n");
    else if (ccn >= 51e14 && ccn < 56e14)
        printf("MASTERCARD\n");
    else if ((ccn >= 4e12 && ccn < 5e12) || (ccn >= 4e15 && ccn < 5e15))
        printf("VISA\n");
    else
        printf("INVALID\n");
}
c cs50 credit-card
2个回答
0
投票

首先,如果您包括“ get_long_long”函数,那将很好,因此我们可以看到输入是如何进行的。其次,校验和函数内部的digit变量未初始化,这引起了一些问题。最后,从here的简短外观来看,您有点用错误的方式实现了该算法,我对其进行了修复,请检查结果是否对您有用:

bool checksum(long long ccn)
{
    int sum = 0;
    int digit;
    for (int i = 0; ccn != 0; i++, ccn /= 10)
    {
        digit = ccn % 10;

        if (i % 2 != 0) {
            digit *= 2;
            if (digit > 9)
                digit -= 9;
        }

        sum += digit;   
    }

    if ((sum % 10) == 0)
        return true;
    else
        return false;
}

0
投票

看来您的错误出在校验和函数中;特别是for循环。

for (int i = 0; ccn != 0; i++, ccn /= 10)
{
    if (i % 2 == 0)
       sum += ccn % 10;
    else
    digit = 2 * (ccn % 10);
    sum += digit / 10 + digit % 10;
}

应该是

for (int i = 0; ccn != 0; i++, ccn /= 10)
{
    if (i % 2 == 0){
       sum += ccn % 10;
    } else {
       digit = 2 * (ccn % 10);
       sum += digit / 10 + digit % 10;
    }
}

if-else语句周围嵌套不正确。我用几个数字进行了测试,他们打印出了正确的输出。

© www.soinside.com 2019 - 2024. All rights reserved.