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

CS50信用卡验证求助:Luhn算法实现错误排查

CS50 Problem Set 1 Credit问题:Luhn算法校验的整数溢出问题解决

我是CS50课程的初学者,正在完成Problem Set 1中的Credit问题,用C语言实现基于Luhn算法的信用卡号验证。原本打算用数组实现,但对数组相关代码理解困难,于是手动编写完整的Luhn计算公式进行校验。但运行时所有合法卡号的checksum计算结果都无法满足card_total % 10 == 0的要求,比如测试卡号4003600000000014得到的checksum为33。

在CS50的VS虚拟代码空间(Linux环境)运行代码,最终将int类型改为long类型后,代码完全正常运行,可配合后续的Amex、Visa等卡种校验逻辑使用。

以下是我的测试代码:

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

long get_number(void);

int main(void)
{
    long n = get_number();

    //calculating card number with modulo

    long a = ((n % 10000000000000000) / 1000000000000000);
    long b = ((n % 1000000000000000) / 100000000000000);
    long c = ((n % 100000000000000) / 10000000000000);
    long d = ((n % 10000000000000) / 1000000000000);
    long e = ((n % 1000000000000) / 100000000000);
    long f = ((n % 100000000000) / 10000000000);
    long g = ((n % 10000000000) / 1000000000);
    long h = ((n % 1000000000) / 100000000);
    long i = ((n % 100000000) / 10000000);
    long j = ((n % 10000000) / 1000000);
    long k = ((n % 1000000) / 100000);
    long l = ((n % 100000) / 10000);
    long m = ((n % 10000) / 1000);
    long ene = ((n % 1000) / 100);
    long o = ((n % 100) / 10);
    long p = ((n % 10) / 1);              //The "/ 1" is just for visualization

    // multiply odd numbers by 2          //Also for visualization
    long q = a * 2;
    long r = c * 2;
    long s = e * 2;
    long t = g * 2;
    long u = i * 2;
    long v = k * 2;
    long w = m * 2;
    long x = o * 2;

    //process odd products               //Luhn's has exceptions for double digit numbers

    long qq;
    if (q < 10)
    {
        qq = ((q % 10) + ((q % 100)/10));
    }
    else if (q > 10)
    {
        qq = (q % 10) + 1;
    }
    else if (q == 10)
    {
        qq = 1;
    }
    else
    {
        qq = q;
    }

    long rr;
    if (r < 10)
    {
         rr = ((r % 10) + ((r % 100) / 10));
    }
    else if (r > 10)
    {
        rr = (r % 10) + 1;
    }
    else if (r == 10)
    {
        rr = 1;
    }
    else
    {
        rr = r;
    }

    long ss;
    if (s < 10)
    {
        ss = ((s % 10) + ((s % 100) / 10));
    }
    else if (s > 10)
    {
        ss = (s % 10) + 1;
    }
    else if (s == 10)
    {
        ss = 1;
    }
    else
    {
        ss = s;
    }

    long tt;
    if (t < 10)
    {
        tt = ((t % 10) + ((t % 100) / 10));
    }
    else if (t > 10)
    {
        tt = (t % 10) + 1;
    }
    else if (t == 10)
    {
        tt = 1;
    }
    else
    {
        tt = t;
    }

    long uu;
    if (u < 10)
    {
        uu = ((u % 10) + ((u % 100) / 10));
    }
    else if (u > 10)
    {
        uu = (u % 10) + 1;
    }
    else if (u == 10)
    {
        uu = 1;
    }
    else
    {
        uu = u;
    }

    long vv;
    if (v < 10)
    {
        vv = ((v % 10) + ((v % 100) / 10));
    }
    else if (v > 10)
    {
        vv = (v % 10) + 1;
    }
    else if (v == 10)
    {
        vv = 1;
    }
    else
    {
        vv = v;
    }

    long ww;
    if (w < 10)
    {
        ww = ((w % 10) + ((w % 100) / 10));
    }
    else if (w > 10)
    {
        ww = (w % 10) + 1;
    }
    else if (w == 10)
    {
        ww = 1;
    }
    else
    {
        ww = w;
    }

    long xx;
    if (x < 10)
    {
        xx = ((x % 10) + ((x % 100) / 10));;
    }
    else if (x > 10)
    {
        xx = (x % 10) + 1;
    }
    else if (x == 10)
    {
        xx = 1;
    }
    else
    {
        xx = x;
    }

    //Sum processed odd products
    long total_odd = qq + rr + ss + tt + uu + vv + ww + xx;

    //sum total odd products and even card numbers
    long bb = ((b % 10) + ((b % 100) / 10));
    long dd = ((d % 10) + ((d % 100) / 10));
    long ff = ((f % 10) + ((f % 100) / 10));
    long hh = ((h % 10) + ((h % 100) / 10));
    long jj = ((j % 10) + ((j % 100) / 10));
    long ll = ((l % 10) + ((l % 100) / 10));
    long eneene = ((ene % 10) + ((ene % 100) / 10));
    long pp = ((p %10) + ((p % 100) / 10));

    long total_even = bb + dd + ff + hh+ jj + ll + eneene + pp;

    //sum odd & even
    long card_total = total_odd + total_even;

    printf(" %li\n", card_total);
}

long get_number(void)                         //Works perfectly
{
    long n;
    do
    {
        n = get_long("Number: ");           // Records credit card number
    }
    while (n < 1000000000000 || n > 5599999999999999); // CC at least 13 digits but < 17 digits
    return n;
}

内容的提问来源于stack exchange,提问作者d-craig

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.02 09:05:14