使用Luhn算法在C中进行信用卡验证

时间:2012-12-05 16:50:13

标签: c pseudocode

#include <stdio.h>


int main(int argc, string argv[])
{
   Get input from the user;
   Store it in a long long int;

   // iterate through the number
   for each odd number in the input multiply by 2
   if the number is bigger than 9 then
   do module of it and add it to the first number;
   store it into metasum;

   for each even number in the input
   add it to the others;
   store the result into metasum2;

   // is it a valid card?
   if (metasum + metasum2)%10 == 0
   {
   card is valid;
   // check which kind of cc is
   if the input begins with a 3 then it's an AMEX;
   else if the input begins with 4 it is a VISA;
   else if the input begins with 5 it is a MASTERCARD;
   }
   else
   {
   card is not valid;
   }

}

它实际上是一种伪代码。我正在参加CS50x,我想知道我的伪代码实现是否足够好。

我还有另外一个问题,当我尝试在C中实现代码时,我不知道如何遍历long long int,所以我无法实现Luhn的算法。

如何在不使用字符串然后将每个char转换为int?

的情况下执行此操作

感谢您的回复

2 个答案:

答案 0 :(得分:2)

要“迭代”非数组,您需要单独跟踪您的位置(计算所有可能的数字),使用除法和模数来推进和提取数字,例如:

long long number = 9999999999;
for (int digitPos = 0; digitPos < 16; digitPos++) {
  int thisDigit = number % 10;
  number = number / 10; 
}

至于你课程的适用性,我不能保证:)

答案 1 :(得分:1)

使用模数和积分除法。

数字右边(最年轻的数字)的第一个数字是number % 10 第二个是(number/10) % 10。第三个是(number/100) % 10。简单模式 - 您可以将其编写为函数。 (请避免在这里混入花车。)

如果你想迭代一个数字的数字,你可能想检查一个数字有多少位数(参见:base-10 logarithm) - 最简单的方法是重复将该数字除以10,直到它是0。


无论如何,请记住,信用卡号码很长!无符号的64位数字可以包含19位有效数字(最大值为2 ** 64-1),所以它是足够用于信用卡,但例如,它不适用于银行账户。使用字符串(某种形式)的方法将更为通用。