You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

CS50信用卡校验代码中checksum函数重复执行原因排查

CS50信用卡问题:checksum函数重复执行两次

我正在编写CS50课程问题集1的信用卡校验代码,功能正常,但调试时发现用于验证Luhn算法的自定义checksum函数会重复执行两次。该函数本应遍历信用卡号,通过更新sum变量完成Luhn算法的每一步,返回0或1供后续digit_checker函数判断卡号是否符合校验规则,但实际会执行两次,生成相同sum值后才进入下一个函数。我尝试调整函数结构和返回方式,仍未找到重复执行的原因。

代码如下:

//prompts and checks for valid credit card number
#include <cs50.h>
#include <stdio.h>

int checksum(long num);
void digit_checker(long num);

int main(void)
{
    //prompts for input
    long card_number = get_long("Number: ");
    checksum(card_number);
    digit_checker(card_number);
}

//creates checksum fuction
int checksum(long num)
{
    long digit_div1 = 100, digit_div2 = 10, digit_div3 = 10, digit_div4 = 1, digit_add = 0, num_i = 0, num_j = 0;
    int sum = 0;
    do
    {
        // seperates digits and mutiplies by 2
        num_i = num % digit_div1;
        num_i -= num_i % digit_div2;
        num_i = num_i / digit_div2;
        digit_add = num_i * 2;

        // adds digits of numbers
        if (digit_add > 9)
        {
            long pre_sum = digit_add - digit_add % 10;
            sum += pre_sum / 10;
            sum += digit_add % 10;
        }
        else
        {
            sum += digit_add;
        }

        // reassigns variable values to target next digit
        digit_div1 = digit_div1 * 100;
        digit_div2 = digit_div2 * 100;
    }
    while (digit_div1 / 10 < num);

    do
    {
        // adds other digits
        num_j = num % digit_div3;
        num_j -= num_j % digit_div4;
        num_j = num_j / digit_div4;
        sum += num_j;

        //reassigns variable values
        digit_div3 = digit_div3 * 100;
        digit_div4 = digit_div4 * 100;
    }
    while (digit_div3 / 10 < num);

    //checks and prints if valid
    if (sum % 10 == 0)
    {
        return 1;
    }
    else
    {
        return 0;
    }
}

void digit_checker(long num)
{
    if (!checksum(num))
    {
        //did not pass sum check
        printf("INVALID\n");
        return;
    }
    int len = 0;
    int first_dig = 0, sec_dig = 0;
    //get first digits and number length
    while (num != 0)
    {
        sec_dig = first_dig;
        first_dig = num % 10;
        num /= 10;
        len++;
    }
    //length & digit checker
    if (len == 13 && first_dig == 4)
    {
        printf("VISA\n");
    }
    else if (len == 16)
    {
        if (first_dig == 4)
        {
            printf("VISA\n");
        }
        else if (first_dig == 5)
        {
            if (sec_dig == 1 || sec_dig == 2 || sec_dig == 3 || sec_dig == 4 || sec_dig == 5)
            {
                printf("MASTERCARD\n");
            }
            else
            {
                printf("INVALID\n");
            }
        }
        else
        {
            printf("INVALID\n");
        }

    }
    else if (len == 15 && first_dig == 3)
    {
        if (sec_dig == 4 || sec_dig == 7)
        {
            printf("AMEX\n");
        }
        else
        {
            printf("INVALID\n");
        }
    }
    else
    {
        //did not pass digit check
        printf("INVALID\n");
    }
    return;
}

内容的提问来源于stack exchange,提问作者Crash8Burn

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.22 02:12:25