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

