C++ Luhn算法无法正常运行c++;

C++ Luhn算法无法正常运行c++;,c++,algorithm,C++,Algorithm,作为一名初学者,我一直在编写一个程序,使用Luhn算法验证一组信用卡号码。它部分工作,但并不完全正确。如果有人能向我解释为什么我会非常感激 它应该输出到控制台 Card : 4686006570307405 is valid Card : 4686006570307407 is invalid Card : 4093650457937474 is invalid Card : 4340423439668810 is valid Card : 1234567812345670 is va

作为一名初学者,我一直在编写一个程序,使用Luhn算法验证一组信用卡号码。它部分工作,但并不完全正确。如果有人能向我解释为什么我会非常感激

它应该输出到控制台

 Card : 4686006570307405 is valid
 Card : 4686006570307407 is invalid
 Card : 4093650457937474 is invalid
 Card : 4340423439668810 is valid
 Card : 1234567812345670 is valid
 Card : 5509415774265347 is invalid
 Card : X234567812345670 is invalid
 Card : 4539281167952835 is valid
 Card : 4532528637398511 is invalid
 Card : 4653549906803760 is valid
Press any key to continue . . .
相反,它输出

 Card : 4686006570307405 is invalid
 Card : 4686006570307407 is invalid
 Card : 4093650457937474 is invalid
 Card : 4340423439668810 is valid
 Card : 1234567812345670 is valid
 Card : 5509415774265347 is invalid
 Card : X234567812345670 is invalid
 Card : 4539281167952835 is invalid
 Card : 4532528637398511 is invalid
 Card : 4653549906803760 is invalid
Press any key to continue . . .
我的代码如下

#include <iostream>
#include <cstring>
#include <fstream>
#include <cstdlib>
#include <string>

using namespace std;


int convertChartoInt(const char digit)
{
    int numericalDigit = digit - '0';

    if (numericalDigit < 0 || numericalDigit > 9)
    {
        throw(0); //not a numerical digit - throw an exception
    }
    return (numericalDigit);
}

bool validateCardNumber(const string number) {

    bool cardStatus = false;
    int evenCount = 0, oddCount = 0,
        calculatedCheckDigit = 0, checkDigit = 0;
    int reverseNumber[15];

    try {

        checkDigit = convertChartoInt(number.at(15));

        for (int i = 0; i < 15; i++) //Reverse digits
        {
            reverseNumber[14 - i] = convertChartoInt(number.at(i));

            for (int i = 0; i < 15; i = i + 2) //calculate the multiple by 2 of the odd numbers
            {
                int doubledigit = 0;
                doubledigit = 2 * reverseNumber[i];
                if (doubledigit > 9)
                {
                    doubledigit = doubledigit - 9;
                }
                evenCount = evenCount + doubledigit;
            }
        }
        for (int i = 1; i < 15; i = i + 2) //calculate the sum of the even numbers
        {
            oddCount = oddCount + reverseNumber[i];
        }
        calculatedCheckDigit = (evenCount + oddCount) % 10; //calculate the check digit
        cardStatus = (calculatedCheckDigit == checkDigit);
    }
    catch (...) {
        cardStatus = false;
    }
    return(cardStatus);
}

int main()
{
    const string testCard[] = { "4686006570307405",
                            "4686006570307407",
                            "4093650457937474",
                            "4340423439668810",
                            "1234567812345670",
                            "5509415774265347",
                            "X234567812345670",
                            "4539281167952835",
                            "4532528637398511",
                            "4653549906803760" };

    int numberOfCards = sizeof(testCard) / sizeof(testCard[0]);

    for (int i = 0; i < 10; i++)
    {
        if (validateCardNumber(testCard[i]))
        {
            cout << " Card : " << testCard[i].c_str() << " is valid" << endl;
        }
        else {
            cout << " Card : " << testCard[i].c_str() << " is invalid" << endl;
        }

        }
    }
#包括
#包括
#包括
#包括
#包括
使用名称空间std;
int convertChartPoint(常量字符数字)
{
int numericalDigit=数字-'0';
if(numericalDigit<0 | | numericalDigit>9)
{
抛出(0);//不是数字-抛出异常
}
返回值(数字单位);
}
布尔validateCardNumber(常量字符串编号){
bool-cardStatus=false;
int evenCount=0,oddCount=0,
calculatedCheckDigit=0,checkDigit=0;
int reverseNumber[15];
试一试{
校验位=转换图表点(在(15)处的数字);
对于(int i=0;i<15;i++)//反向数字
{
ReverseEnumber[14-i]=ConvertChartPoint(在(i)处的数字);
对于(int i=0;i<15;i=i+2)//计算奇数的2倍
{
整数双位数=0;
双位数=2*ReverseEnumber[i];
如果(两位数>9)
{
双位数=双位数-9;
}
evenCount=evenCount+两位数;
}
}
for(int i=1;i<15;i=i+2)//计算偶数之和
{
oddCount=oddCount+reverseEnumber[i];
}
calculatedCheckDigit=(evenCount+oddCount)%10;//计算校验位
cardStatus=(calculatedCheckDigit==checkDigit);
}
捕获(…){
cardStatus=false;
}
返回(cardStatus);
}
int main()
{
常量字符串测试卡[]={“4686006570307405”,
"4686006570307407",
"4093650457937474",
"4340423439668810",
"1234567812345670",
"5509415774265347",
“X234567812345670”,
"4539281167952835",
"4532528637398511",
"4653549906803760" };
int numberOfCards=sizeof(testCard)/sizeof(testCard[0]);
对于(int i=0;i<10;i++)
{
if(验证卡号(测试卡[i]))
{

cout我不熟悉您试图实现的算法,但似乎您的问题的根源是
reverseEnumber
数组未初始化


validateCardNumber
函数中,设置
ReverseEnumber[14-i]
值,然后读取
ReverseEnumber[i]
。对于
i=0
(最外层循环的第一次迭代)这意味着您正在从内存中读回一些垃圾。

如果您解释代码中哪里出了问题(您确实使用了调试器,对吗?)并一块一块地解释程序,会更容易一些。我认为棘手的部分——在足够早的时候,您所说的可能会超出某人的理解(“什么是调试器?”).一旦学会了,他们就不需要我们的帮助来解决问题了。但是在这个问题上投入多一点精力会更好。它每次都给你相同的输出吗?是的,它每次都给你相同的输出…我对所有这一切都很陌生,所以不太熟悉调试一个程序。抱歉占用你的时间一半是正确的,一个问题是
reverseNumber
没有初始化。但是,问题的其余部分来自算法的实现。此外,使用
-9
而不是
%10
。对于任何小于9的值,使用
-9
而不是
%10
都不会产生相同的结果。如果
2*reverseNumber[i]
18
双位数中的期望值是
9
。它是两个数字的总和,而不是模。当然,需要有一个条件来检查它是否小于
9
reverseNumber[i]>4?(reverseNumber[i]*2)-9:reverseNumber[i]*2;
我明白了,我不知道目标是对数字求和,那就忘了这一点。感谢您解释btwThanks simpel01和@james root在这方面的帮助!!