我正在为 CS50 问题集 1 中的信用问题编写一段代码。这段代码已经可以运行,但在一些调试过程中,我注意到我的第一个函数(检查信用卡号是否符合 Luhn 算法)重复了两次。该程序仍然成功地检查了卡号,但我想了解为什么该功能会重复两次。
该函数应该通过使用新值更新总和变量来运行,因为它梳理输入的信用卡号,执行 Luhn 算法中的每个步骤。然后它返回一个 0 或 1 的返回值,由下一个打印卡类型的函数处理,以确定卡号是否符合算法。相反,该函数运行两次,在下一个函数运行之前两次产生相同的总和值。我试过尝试构建函数的格式,以及第一个函数的返回方式,但我无法确定它为什么会重复。
//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;
}
函数
digit_checker
调用函数checksum
void digit_checker(long num)
{
if (!checksum(num))
//...
再来一次,:)
checksum(card_number);
digit_checker(card_number);
看来你需要删除这个声明
checksum(card_number);
没有效果。