Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <iostream>
- #include <string>
- #include <cmath>
- using namespace std;
- bool startsWith(const string& cardNumber, const string& substr)
- {
- //cout << "startsWith recieved cardNumber: " << cardNumber << " and substr: " << substr << endl;
- bool valid = true;
- int c = 0;
- while (c < int(substr.length()))
- {
- //cout << "Loop where c = " << c << " < " << int(substr.length()) << " compares cardNumber.at(c) " << cardNumber.at(c) << " and substr.at(c) " << substr.at(c) << endl;
- if(cardNumber.at(c) != substr.at(c)){
- valid = false;
- break;
- }
- else
- c++;
- }
- //cout << "startsWith is returning (0|1 for false|true): " << valid << endl;
- return valid;
- }
- int getDigit(int number)
- {
- //cout << "getDigit recieved number: " << number << endl;
- number = (number % 10) + (number / 10);
- //cout << "getDigit is returning: " << number << endl;
- return number;
- }
- int sumOfDoubleEvenPlace(const string& cardNumber)
- {
- //cout << "sumOfDoubleEvenPlace recieved cardNumber: " << cardNumber << endl;
- int sumOfEven = 0;
- //cout << "sumOfEven is initialized as " << sumOfEven << endl;
- //cout << "attempting to initialize for loop with first index of " << (cardNumber.length()-(cardNumber.length()%2))-1 << endl;
- for(int i=(cardNumber.length()-(cardNumber.length()%2))-2; i >= 0; i -= 2)
- {
- int doubledCardNumber = int(cardNumber.at(i)-'0');
- doubledCardNumber *= 2;
- sumOfEven += getDigit(doubledCardNumber);
- //cout << "sumOfEven is " << sumOfEven << " += cardNumber.at(i) " << cardNumber.at(i) << " *2 = " << doubledCardNumber << " processed with getDigit()" << endl;
- }
- //cout << "sumOfDoubleEvenPlace is returning: " << sumOfEven << endl;
- return sumOfEven;
- }
- int sumOfOddPlace(const string& cardNumber)
- {
- //cout << "sumOfOddPlace recieved cardNumber: " << cardNumber << endl;
- int sumOfOdd = 0;
- for(int i=cardNumber.length()+(-1+cardNumber.length()%2); i >= 0; i -= 2)
- {
- //cout << "sumOfOdd is " << sumOfOdd << " plus cardNumber.at(i) " << cardNumber.at(i) << endl;
- sumOfOdd += int(cardNumber.at(i)-'0');
- }
- //cout << "sumOfOddPlace is returning: " << sumOfOdd << endl;
- return sumOfOdd;
- }
- bool isValid(const string& cardNumber)
- {
- //cout << "isValid recieved cardNumber: " << cardNumber << endl;
- bool valid = false;
- //cout << "The length of your input is " << cardNumber.length() << endl;
- int sum = (sumOfOddPlace(cardNumber) + sumOfDoubleEvenPlace(cardNumber)) %10;
- //cout << "Sum % 10 is " << sum << endl;
- if((cardNumber.length() >= 13 && cardNumber.length() <= 16) &&
- sum == 0 &&
- (startsWith(cardNumber, "37") || startsWith(cardNumber, "4") ||
- startsWith(cardNumber, "5") || startsWith(cardNumber, "6")))
- {
- valid = true;
- }
- //cout << "isValid is returning (0|1 for false|true): " << valid << endl;
- return valid;
- }
- // The main function that uses the other functions to determine whether the card is valid or not
- void main()
- {
- cout << "Enter a credit card number: ";
- string cardNumber;
- cin >> cardNumber;
- if(isValid(cardNumber))
- cout << "The credit card number is valid" << endl;
- else
- cout << "The credit card number is invalid" << endl;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement