#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?
的情况下执行此操作感谢您的回复
答案 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),所以它是足够用于信用卡,但例如,它不适用于银行账户。使用字符串(某种形式)的方法将更为通用。