下面的函数对给定的卡号执行 Luhn 算法,但会抛出一些卡号的运行时错误。试图理解为什么?
The below function performs Luhn's Algorithm on a given card number, but throws up runtime error with some card numbers. Trying to understand why?
我在 运行 下面的函数中对任何给定的卡号进行求和校验(Luhn 算法),但对某些卡号的校验失败并且还会抛出运行时错误:"Index out of bounds for type 'int[count]'." 我我猜这是关于数组 odd/even 但无法弄清楚的原因。
已经尝试 运行 循环到各种计数,如 count+1 和 count-1 等
int sum1 = 0;
int sum2 = 0;
int count = digit_counter(cc_num);
int hold[count];
for(int i=0; i<count; i++)
{
hold[i]= cc_num%10;
cc_num = cc_num/10;
}
for(int i=0; i<count; i++)
{
printf("%i\n",hold[i]);
}
int i,j;
for (i=1,j=0; i<=count || j<count; i+=2,j+=2)
{
hold[i] = hold[i]*2;
if (hold[i]>10)
{
sum1+= (hold[i]/10)+(hold[i]%10);
}
else
{
sum1+= hold[i];
}
sum2+=hold[j];
}
return sum1+sum2;
不应抛出任何运行时错误,并且能够对所有卡片执行 sumcheck。
试试这个
int sum = 0;
bool odd = true;
for (int i = data.Length - 1; i >= 0; i--)
{
if (odd == true)
{
int tSum = Convert.ToInt32(data[i].ToString()) * 2;
if (tSum >= 10)
{
string tData = tSum.ToString();
tSum = Convert.ToInt32(tData[0].ToString()) + Convert.ToInt32(tData[1].ToString());
}
sum += tSum;
}
else
sum += Convert.ToInt32(data[i].ToString());
odd = !odd;
}
return (((sum / 10) + 1) * 10) - sum;
如前所述,您的循环有错误的停止条件。假设你的 cc_num 在没有 Luhn 的情况下保持平底锅并且你的 digit_counter 工作正常你可以尝试类似的东西:
int i;
for (i=0; i<count; ++i)
{
bool isDouble=(count - i) % 2 != 0;
sum1 += isDouble ? 2 * hold[i] % 10 + 2 * hold[i] / 10 : hold[i];
}
return 9 * sum1 % 10;
我在 运行 下面的函数中对任何给定的卡号进行求和校验(Luhn 算法),但对某些卡号的校验失败并且还会抛出运行时错误:"Index out of bounds for type 'int[count]'." 我我猜这是关于数组 odd/even 但无法弄清楚的原因。
已经尝试 运行 循环到各种计数,如 count+1 和 count-1 等
int sum1 = 0;
int sum2 = 0;
int count = digit_counter(cc_num);
int hold[count];
for(int i=0; i<count; i++)
{
hold[i]= cc_num%10;
cc_num = cc_num/10;
}
for(int i=0; i<count; i++)
{
printf("%i\n",hold[i]);
}
int i,j;
for (i=1,j=0; i<=count || j<count; i+=2,j+=2)
{
hold[i] = hold[i]*2;
if (hold[i]>10)
{
sum1+= (hold[i]/10)+(hold[i]%10);
}
else
{
sum1+= hold[i];
}
sum2+=hold[j];
}
return sum1+sum2;
不应抛出任何运行时错误,并且能够对所有卡片执行 sumcheck。
试试这个
int sum = 0;
bool odd = true;
for (int i = data.Length - 1; i >= 0; i--)
{
if (odd == true)
{
int tSum = Convert.ToInt32(data[i].ToString()) * 2;
if (tSum >= 10)
{
string tData = tSum.ToString();
tSum = Convert.ToInt32(tData[0].ToString()) + Convert.ToInt32(tData[1].ToString());
}
sum += tSum;
}
else
sum += Convert.ToInt32(data[i].ToString());
odd = !odd;
}
return (((sum / 10) + 1) * 10) - sum;
如前所述,您的循环有错误的停止条件。假设你的 cc_num 在没有 Luhn 的情况下保持平底锅并且你的 digit_counter 工作正常你可以尝试类似的东西:
int i;
for (i=0; i<count; ++i)
{
bool isDouble=(count - i) % 2 != 0;
sum1 += isDouble ? 2 * hold[i] % 10 + 2 * hold[i] / 10 : hold[i];
}
return 9 * sum1 % 10;