为什么我的 PSET1 学分在沙箱中有效,但在 Check50 中无效?
Why is my PSET1 Credit working in sandbox but not Check50?
我有问题,我的 PSET1 信用程序在 CS50 沙盒中运行,并且能够根据卡的长度和 Luhn 算法确定卡是 MasterCard、AMEX 还是 VISA。但是,当我将代码提交给 Check50 时,它确定所有输入均无效。
更新:如果数字不符合 Luhn 的算法,我不再打印 "INVALID",而是将其更改为打印 "nope" 并发现 check50 检查的所有数字都会导致输出 "nope," 所以我知道错误在程序的那个部分的某个地方。和以前一样,它仍然在沙箱中工作。
我在这里和其他地方寻找过类似的问题和解决方案。
#include <stdio.h>
#include <cs50.h>
int main(void)
{
//Ask user to input number.
long card_num;
do
{
card_num = get_long("Number: ");
}
//Check if card number is greater than zero.
while (card_num < 0);
//Starting with the second to last digit, multiply each digit by 2.
//Add the products' digits together.
int digit, prod, sum1, dig1, dig2;
long holder = card_num;
while (holder > 0)
{
digit = (holder / 10) % 10;
prod = digit * 2;
if (prod >= 10)
{
dig1 = (prod % 100 - (prod % 10)) / 10;
dig2 = prod % 10;
prod = dig1 + dig2;
}
sum1 = sum1 + prod;
holder = holder / 100;
}
//Add sum1 to product of the other digits in the card number
long holder1 = card_num;
int dig3, sum2;
while (holder1 > 0)
{
dig3 = holder1 % 10;
sum2 = sum2 + dig3;
holder1 = holder1 / 100;
}
//Check if the sum of the first and second sums has a final digit of 0.
int last_sum = sum1 + sum2;
if (last_sum % 10 != 0)
{
printf("INVALID\n");
}
else
{
//Calculate number of digits
int num_digits = 0;
long holder3 = card_num;
while (holder3 != 0)
{
holder3 = holder3 / 10;
num_digits++;
}
//Find first two digits of card number
long holder2 = card_num;
while (holder2 > 100)
{
holder2 = holder2 / 10;
}
int firstdig, secdig;
secdig = holder2 % 10;
firstdig = holder2 / 10;
//Check if VISA, Mastercard, or AMEX
if (firstdig == 4)
{
if (num_digits == 13 || num_digits == 16)
{
printf ("VISA\n");
}
}
else if (firstdig == 5 && secdig >= 1 && secdig <= 5)
{
if (num_digits == 16)
{
printf ("MASTERCARD\n");
}
}
else if (firstdig == 3 && (secdig == 4 || secdig == 7))
{
if (num_digits == 15)
{
printf ("AMEX\n");
}
}
else (printf("INVALID\n"));
}
}
预期结果为 MASTERCARD、VISA、AMEX 或 INVALID。在 Sandbox 中它有效,但 Check50 对所有数字无效。
不同的系统可以有不同的实现大小'long'。
建议使用 stdint.h
中的 uint64_t
因为
- 在不同 systems/implementations
中始终保持相同大小
- 该值需要无符号,因为移动有符号值会产生问题。
调用scanf()
时,建议使用格式说明符:SCNu64
SCNu64
来自 inttypes.h
scanf()
的示例
uint64_t card_num;
scanf( "%" SCNu64, &card_num );
how to validate a credit card number
记下信用卡号的最后一位。这是您将用来验证信用卡号剩余部分的校验和数字。
列出信用卡号的每一位数字,从校验和左边的数字开始,向左移动。如果信用卡号有 16 位数字,则在将其添加到您的列表之前,从右到左将奇数位置的每个数字的数量加倍。对于 15 位的信用卡,您可以将偶数位置的数字加倍。如果将一个数字加倍得到一个大于 10 的数字,将新数字的两个数字相加并将结果写在你的列表上。例如,如果卡片上的数字是七,则将其加倍就是 14。那么两位数字的总和就是五。
总计你的数字列表。不要在总数中包括校验和数字。如果总数能被 10 整除,则信用卡有有效号码。否则,您不应处理信用卡交易。
How to determine supplier of credit card
通过查看第一个数字来识别银行卡的信用公司。以“3”开头的卡是美国运通卡。以“4”开头的是Visa信用卡和借记卡,以“5”开头的是MasterCard信用卡和借记卡,以“6”开头的是Discover信用卡。向商户收取的服务费因卡公司而异。
计算信用卡号码中的数字。大多数信用卡应包含 15 或 16 位数字。美国运通信用卡包含 15 个。其他三大信用卡公司 - Visa、Mastercard 和 Discover - 在他们的卡上有一个 16 位序列。
我发现问题是我已经声明了变量 sum1 和 sum2,但没有将它们初始化为任何值,所以它们被分配了内存中的任何值。当我也将这些初始化为 0 时,程序运行正常。
我有问题,我的 PSET1 信用程序在 CS50 沙盒中运行,并且能够根据卡的长度和 Luhn 算法确定卡是 MasterCard、AMEX 还是 VISA。但是,当我将代码提交给 Check50 时,它确定所有输入均无效。
更新:如果数字不符合 Luhn 的算法,我不再打印 "INVALID",而是将其更改为打印 "nope" 并发现 check50 检查的所有数字都会导致输出 "nope," 所以我知道错误在程序的那个部分的某个地方。和以前一样,它仍然在沙箱中工作。
我在这里和其他地方寻找过类似的问题和解决方案。
#include <stdio.h>
#include <cs50.h>
int main(void)
{
//Ask user to input number.
long card_num;
do
{
card_num = get_long("Number: ");
}
//Check if card number is greater than zero.
while (card_num < 0);
//Starting with the second to last digit, multiply each digit by 2.
//Add the products' digits together.
int digit, prod, sum1, dig1, dig2;
long holder = card_num;
while (holder > 0)
{
digit = (holder / 10) % 10;
prod = digit * 2;
if (prod >= 10)
{
dig1 = (prod % 100 - (prod % 10)) / 10;
dig2 = prod % 10;
prod = dig1 + dig2;
}
sum1 = sum1 + prod;
holder = holder / 100;
}
//Add sum1 to product of the other digits in the card number
long holder1 = card_num;
int dig3, sum2;
while (holder1 > 0)
{
dig3 = holder1 % 10;
sum2 = sum2 + dig3;
holder1 = holder1 / 100;
}
//Check if the sum of the first and second sums has a final digit of 0.
int last_sum = sum1 + sum2;
if (last_sum % 10 != 0)
{
printf("INVALID\n");
}
else
{
//Calculate number of digits
int num_digits = 0;
long holder3 = card_num;
while (holder3 != 0)
{
holder3 = holder3 / 10;
num_digits++;
}
//Find first two digits of card number
long holder2 = card_num;
while (holder2 > 100)
{
holder2 = holder2 / 10;
}
int firstdig, secdig;
secdig = holder2 % 10;
firstdig = holder2 / 10;
//Check if VISA, Mastercard, or AMEX
if (firstdig == 4)
{
if (num_digits == 13 || num_digits == 16)
{
printf ("VISA\n");
}
}
else if (firstdig == 5 && secdig >= 1 && secdig <= 5)
{
if (num_digits == 16)
{
printf ("MASTERCARD\n");
}
}
else if (firstdig == 3 && (secdig == 4 || secdig == 7))
{
if (num_digits == 15)
{
printf ("AMEX\n");
}
}
else (printf("INVALID\n"));
}
}
预期结果为 MASTERCARD、VISA、AMEX 或 INVALID。在 Sandbox 中它有效,但 Check50 对所有数字无效。
不同的系统可以有不同的实现大小'long'。
建议使用 stdint.h
中的 uint64_t
因为
- 在不同 systems/implementations 中始终保持相同大小
- 该值需要无符号,因为移动有符号值会产生问题。
调用scanf()
时,建议使用格式说明符:SCNu64
SCNu64
来自 inttypes.h
scanf()
uint64_t card_num;
scanf( "%" SCNu64, &card_num );
how to validate a credit card number
记下信用卡号的最后一位。这是您将用来验证信用卡号剩余部分的校验和数字。
列出信用卡号的每一位数字,从校验和左边的数字开始,向左移动。如果信用卡号有 16 位数字,则在将其添加到您的列表之前,从右到左将奇数位置的每个数字的数量加倍。对于 15 位的信用卡,您可以将偶数位置的数字加倍。如果将一个数字加倍得到一个大于 10 的数字,将新数字的两个数字相加并将结果写在你的列表上。例如,如果卡片上的数字是七,则将其加倍就是 14。那么两位数字的总和就是五。
总计你的数字列表。不要在总数中包括校验和数字。如果总数能被 10 整除,则信用卡有有效号码。否则,您不应处理信用卡交易。
How to determine supplier of credit card
通过查看第一个数字来识别银行卡的信用公司。以“3”开头的卡是美国运通卡。以“4”开头的是Visa信用卡和借记卡,以“5”开头的是MasterCard信用卡和借记卡,以“6”开头的是Discover信用卡。向商户收取的服务费因卡公司而异。
计算信用卡号码中的数字。大多数信用卡应包含 15 或 16 位数字。美国运通信用卡包含 15 个。其他三大信用卡公司 - Visa、Mastercard 和 Discover - 在他们的卡上有一个 16 位序列。
我发现问题是我已经声明了变量 sum1 和 sum2,但没有将它们初始化为任何值,所以它们被分配了内存中的任何值。当我也将这些初始化为 0 时,程序运行正常。