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
相关产品推荐
相关产品推荐

