我正在研究CS50的信用问题。但是,无论我输入什么卡号,我都只会打印INVALID。请问代码有什么问题?计算总和的部分似乎有问题。
#include <cs50.h>
#include <stdio.h>
#include <math.h>
int main(void)
{
// Get the card number
long num;
do
{
num = get_long("What is the card number?\n");
} while (num < 0);
long sum = 0, sum2 = 0, count = 0;
//Get the sum
for (long i = num; i > 0; i = i / 10)
{
sum += i % 10;
count++;
}
for (long i = num / 10; i > 0; i = i / 100)
{
sum2 += i % 10;
}
if ((sum + sum2) % 10 != 0)
{
printf("INVALID");
}
else
{
long digits = num / (10 * (count - 2));
if (count == 15 &&
(digits == 34 || digits == 37))
{
printf("AMERICAN EXPRESS");
}
else if (count == 16 && 51 <= digits <=55)
{
printf("MASTERCARD");
}
else if ((count == 16 || count == 13) && (digits / 10) == 4)
{
printf("VISA");
}
else
{
printf("INVALID");
}
}
}
答案 0 :(得分:1)
这给出了每个位数的总和。
for (long i = num; i > 0; i = i / 10)
{
sum += i % 10;
count++;
}
再次查看问题集,特别是有关Luhn算法的讨论。有两个总和,但是它们是“互斥的”。如果将数字添加到sum1,则不会将其添加到sum2。反之亦然。代码中的任何地方都明显缺少*2
(时间2)。
也许您会发现此walkthrough video有用。请注意:它来自课程的早期版本,并提到了功能get_long_long
。已经退休了,像在这里一样使用get_long
。