要确定信用卡号是否有效,
从数字的倒数第二位数字开始,每隔一个数字乘以 2,然后将这些产品的数字相加。 将总和与未乘以 2 的数字之和相加。 如果总计的最后一位数字为 0(或者更正式地说,如果总计模 10 与 0 全等),则该数字有效
#include <cs50.h>
#include <stdio.h>
#include <string.h>
int get_check_number(char str_number[]);
bool check_number(int number);
int sumOfDigits(int num);
int main(void)
{
long number = get_long("NUMBER: ");
char str_number[20];
sprintf(str_number, "%ld", number);
int firstTwoDigits = (int)(number / 100000000000000);
if (check_number(get_check_number(str_number)))
{
printf("INVALID\n");
}
else
{
int length = strlen(str_number);
if (length != 16 && length != 13 && length != 15)
{
printf("INVALID\n");
}
else
{
switch (firstTwoDigits)
{
case 42:
case 49:
case 40:
case 41:
printf("VISA\n");
break;
case 51:
case 52:
case 53:
case 54:
case 55:
printf("MASTERCARD\n");
break;
case 34:
case 37:
if (strlen(str_number) == 15)
{
printf("AMEX\n");
break;
}
default:
printf("INVALID\n");
}
}
}
}
int get_check_number(char str_number[])
{
int total_sum = 0;
int length = strlen(str_number);
for (int x = 0; x < length; x += 2)
{
int double_num = (str_number[x] - '0') * 2;
total_sum += sumOfDigits(double_num);
}
for (int x = 1; x < length; x += 2)
{
total_sum += str_number[x] - '0';
}
printf("%d", total_sum);
return total_sum;
}
bool check_number(int number)
{
char check[20];
sprintf(check, "%d", number);
int length = strlen(check);
char last_char = check[length - 1];
if (last_char != '0')
{
return true;
}
return false;
}
int sumOfDigits(int num)
{
int sum = 0;
while (num != 0)
{
sum += num % 10;
num /= 10;
}
return sum;
}
这是我的代码,它适用于大多数信用卡号码,但是对于卡号 378282246310005 和 371449635398431 它返回 INVALID
您的循环条件不考虑第二个循环的长度。
更新第二个循环条件以迭代至
length - 1
for (int x = 1; x < length - 1; x += 2)