我目前正在尽力解决这个问题。但是,我遇到了以下问题:
检查完总和后,我想验证卡号中的前2位数字。 所以我使用以下方法:
int main(void)
{
long long ccn;
do
{
ccn = get_long_long("Credit Card No.:\n");
}
while (ccn < 0);
int ccn_len;
long long count = ccn;
long long bccn = ccn;
for (ccn_len = 0; count != 0; ccn_len++, count /= 10);
int sum = 0; //checksum
for (int i = 0; i < ccn_len; ccn /= 10, i++)
{
if (i % 2 == 0)
{
sum += ccn % 10;
}
else
{
int digit = (ccn % 10) * 2;
sum += digit / 10 + digit % 10;
}
}
if (sum % 10 != 0)
{
printf("INVALID");
}
else
{
int a = bccn / 1e13;
if ((bccn / 1e13 == 34 || bccn / 1e13 == 37) && ccn_len == 15)
{
printf("AMERICAN EXPRESS");
}
else if (bccn / 1e12 == 4 && ccn_len == 13)
{
printf("VISA");
}
else if (ccn_len == 16)
{
if (bccn / 1e15 == 4)
{
printf("VISA");
}
if (bccn / 1e14 > 50 || bccn / 1e14 < 56)
{
printf("MASTERCARD");
}
}
else
{
printf("INVALID");
}
}
}
}
假设它是有效的AE卡:378282246310005,长度为15位数字
在上面的代码中,我使用ccn / 1e13来获取前两位数字以检查它是34还是37。
但是,在满足校验和之后,输出仍然显示INVALID。
我尝试使用另一种方法, 我设置一个变量 和a = ccn / 1e13 然后在if语句中放一个:
if ((a == 34 || a == 37) || ccn_len == 15)
这次一切正常。
谁能告诉我我的代码出了什么问题?还是我写得更好?
非常感谢您的答复。
答案 0 :(得分:0)
1e13
是类型为double
的浮点常量。在bccn / 1e13
中,bccn
被转换为double
,然后执行浮点除法,得到诸如37.82822463100050214279690408147871494293212890625的数字。然后bccn / 1e13 == 37
的判断结果为假,因为37.8282246310005050279279690408147871494293212890625不等于37。
将代码重写为仅使用整数算术(不要使用1e13
之类的浮点常量)或将信用卡“数字”视为数字字符串而不是整数。