【发布时间】:2022-10-01 07:31:35
【问题描述】:
这是 CS50x 的信用问题 我在 Windows 上编写了这段代码,但它在那里不起作用。在 Windows 上输入 15 位数的卡号后,它不接受该号码,并一次又一次地提示我。 但是,当我在 Linux 上的 VSCode 中的 CS50\'s cloudspace 上粘贴相同的代码时,代码在那里运行得非常好。 问题似乎出在 get_long 函数中,它不允许我在 Windows 上输入 15 位数的卡号。
#include <stdio.h>
#include \"cs50.h\"
int main()
{
long number;
number = get_long(\"Enter your card number: \");
//Check length of number
int i = 0;
long length = number;
while (length > 0 )
{
length = length / 10;
i++;
}
if (i != 16 && i != 15 && i!= 13)
{
printf (\"INVALID\");
}
else
{
int sum1 = 0;
int sum2 = 0;
long x = number;
int mod1 = 0;
int mod2 = 0;
int d1 = 0;
int d2 = 0;
int final_sum = 0;
do
{
//Remove last digit and add to sum1
mod1 = x % 10;
x = x / 10;
sum1 = sum1 + mod1;
//Remove second last digit
mod2 = x % 10;
x = x / 10;
//Multiply second last digit by two
mod2 = mod2 * 2;
//Extract the digits
d1 = mod2 % 10;
d2 = mod2 / 10;
//Add to sum2
sum2 = sum2 + d1 + d2;
} while (x > 0 );
final_sum = sum1 + sum2;
//Check Luhns Algorithm
if (final_sum % 10 != 0)
{
printf(\"INVALID\\n\");
}
else
{
long y = number;
int j = 0;
do
{
y = y / 10;
j++;
} while (y > 100 );
if ( y / 10 == 4)
{
printf (\"VISA\");
}
else if ((y / 10 == 5) && (0 < y % 10 && y % 10 < 6))
{
printf(\"MASTERCARD\");
}
else if ((y / 10 == 3) && (y % 10 ==4 || y % 10 == 7) )
{
printf(\"AMEX\");
}
}
}
}
-
由于您正在调用
get_long_long,因此您还应该使用long long数据类型,而不仅仅是long -
可能是因为
long只有 32 位。请更改曲目:使用字符串作为 \"number\"。它不是整数。没有人使用整数来存储卡、电话或房子的“号码”。无论如何,拥有数字字符串可以很容易地挑选出单个数字,你不觉得吗? -
@AndrewHenle,对不起,我以为那是我写的。不是“也许”是 32 位,而是失败的原因。
-
@WeatherVane 我没有那样读。对我来说是漫长的一天。 :-/
-
@风向标没有人使用好吧,当然,除了大批 CS50 程序员...
标签: c cs50 long-integer