为什么我的程序对某些信用卡号码返回无效

问题描述 投票:0回答:1

要确定信用卡号是否有效,

从数字的倒数第二位数字开始,每隔一个数字乘以 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

cs50
1个回答
0
投票

您的循环条件不考虑第二个循环的长度。

更新第二个循环条件以迭代至

length - 1

for (int x = 1; x < length - 1; x += 2)
© www.soinside.com 2019 - 2024. All rights reserved.