编写一个程序,提示用户以长整数形式输入信用卡号,并显示该卡是否有效。 信用卡号码遵循一定的模式。 信用卡号必须在13到16位之间。它必须从以下方面开始:
null
- 4.Visa卡
- 5张万事达卡
- 37张美国运通卡
- 6.探索卡
这个问题可以通过使用 卢恩算法 . 卢恩支票 或者 Mod 10 检查,可描述如下(用于说明, 考虑卡号4388576018402626): 第一步 .从右到左每隔两位数。如果数字加倍会导致 两位数,将两位数相加得到一个位数(如12:1+2,18=1+8)。 第二步 .现在将步骤1中的所有单位数相加。 4 + 4 + 8 + 2 + 3 + 1 + 7 + 8 = 37 第三步 .在卡号中从右到左的奇数处添加所有数字。 6 + 6 + 0 + 8 + 0 + 7 + 8 + 3 = 38 第四步 .将步骤2和步骤3的结果相加。 37 + 38 = 75 第五步 .如果步骤4的结果可被10整除,则卡号有效;否则无效。 例如:
Input : 379354508162306Output : 379354508162306 is ValidInput : 4388576018402626Output : 4388576018402626 is invalid
C++
// C++ program to check if a given credit // card is valid or not. #include <iostream> using namespace std; // Return this number if it is a single digit, otherwise, // return the sum of the two digits int getDigit( int number) { if (number < 9) return number; return number / 10 + number % 10; } // Return the number of digits in d int getSize( long d) { string num = to_string(d); return num.length(); } // Return the first k number of digits from // number. If the number of digits in number // is less than k, return number. long getPrefix( long number, int k) { if (getSize(number) > k) { string num = to_string(number); return stol(num.substr(0, k)); } return number; } // Return true if the digit d is a prefix for number bool prefixMatched( long number, int d) { return getPrefix(number, getSize(d)) == d; } // Get the result from Step 2 int sumOfDoubleEvenPlace( long int number) { int sum = 0; string num = to_string(number) ; for ( int i = getSize(number) - 2; i >= 0; i -= 2) sum += getDigit( int (num[i] - '0' ) * 2); return sum; } // Return sum of odd-place digits in number int sumOfOddPlace( long number) { int sum = 0; string num = to_string(number) ; for ( int i = getSize(number) - 1; i >= 0; i -= 2) sum += num[i] - '0' ; return sum; } // Return true if the card number is valid bool isValid( long int number) { return (getSize(number) >= 13 && getSize(number) <= 16) && (prefixMatched(number, 4) || prefixMatched(number, 5) || prefixMatched(number, 37) || prefixMatched(number, 6)) && ((sumOfDoubleEvenPlace(number) + sumOfOddPlace(number)) % 10 == 0); } // Driver Code int main() { long int number = 5196081888500645L; cout << number << " is " << (isValid(number) ? "valid" : "invalid" ); return 0; } // This code is contributed by yuvraj_chandra |
JAVA
// Java program to check if a given credit // card is valid or not. import java.util.Scanner; public class CreditCard { // Main Method public static void main(String[] args) { long number = 5196081888500645L; System.out.println(number + " is " + (isValid(number) ? "valid" : "invalid" )); } // Return true if the card number is valid public static boolean isValid( long number) { return (getSize(number) >= 13 && getSize(number) <= 16 ) && (prefixMatched(number, 4 ) || prefixMatched(number, 5 ) || prefixMatched(number, 37 ) || prefixMatched(number, 6 )) && ((sumOfDoubleEvenPlace(number) + sumOfOddPlace(number)) % 10 == 0 ); } // Get the result from Step 2 public static int sumOfDoubleEvenPlace( long number) { int sum = 0 ; String num = number + "" ; for ( int i = getSize(number) - 2 ; i >= 0 ; i -= 2 ) sum += getDigit(Integer.parseInt(num.charAt(i) + "" ) * 2 ); return sum; } // Return this number if it is a single digit, otherwise, // return the sum of the two digits public static int getDigit( int number) { if (number < 9 ) return number; return number / 10 + number % 10 ; } // Return sum of odd-place digits in number public static int sumOfOddPlace( long number) { int sum = 0 ; String num = number + "" ; for ( int i = getSize(number) - 1 ; i >= 0 ; i -= 2 ) sum += Integer.parseInt(num.charAt(i) + "" ); return sum; } // Return true if the digit d is a prefix for number public static boolean prefixMatched( long number, int d) { return getPrefix(number, getSize(d)) == d; } // Return the number of digits in d public static int getSize( long d) { String num = d + "" ; return num.length(); } // Return the first k number of digits from // number. If the number of digits in number // is less than k, return number. public static long getPrefix( long number, int k) { if (getSize(number) > k) { String num = number + "" ; return Long.parseLong(num.substring( 0 , k)); } return number; } } |
C#
// C# program to check if a given // credit card is valid or not. using System; class CreditCard { // Main Method public static void Main() { long number = 5196081888500645L; Console.Write(number + " is " + (isValid(number) ? "valid" : "invalid" )); } // Return true if the card number is valid public static bool isValid( long number) { return (getSize(number) >= 13 && getSize(number) <= 16) && (prefixMatched(number, 4) || prefixMatched(number, 5) || prefixMatched(number, 37) || prefixMatched(number, 6)) && ((sumOfDoubleEvenPlace(number) + sumOfOddPlace(number)) % 10 == 0); } // Get the result from Step 2 public static int sumOfDoubleEvenPlace( long number) { int sum = 0; String num = number + "" ; for ( int i = getSize(number) - 2; i >= 0; i -= 2) sum += getDigit( int .Parse(num[i] + "" ) * 2); return sum; } // Return this number if it is a // single digit, otherwise, return // the sum of the two digits public static int getDigit( int number) { if (number < 9) return number; return number / 10 + number % 10; } // Return sum of odd-place digits in number public static int sumOfOddPlace( long number) { int sum = 0; String num = number + "" ; for ( int i = getSize(number) - 1; i >= 0; i -= 2) sum += int .Parse(num[i] + "" ); return sum; } // Return true if the digit d // is a prefix for number public static bool prefixMatched( long number, int d) { return getPrefix(number, getSize(d)) == d; } // Return the number of digits in d public static int getSize( long d) { String num = d + "" ; return num.Length; } // Return the first k number of digits from // number. If the number of digits in number // is less than k, return number. public static long getPrefix( long number, int k) { if (getSize(number) > k) { String num = number + "" ; return long .Parse(num.Substring(0, k)); } return number; } } // This code is contributed by nitin mittal. |
输出:
5196081888500645 is valid
本文由 维沙尔·库马尔·古普塔 .如果你喜欢GeekSforgek,并想贡献自己的力量,你也可以使用 贡献极客。组织 或者把你的文章寄到contribute@geeksforgeeks.org.看到你的文章出现在Geeksforgeks主页上,并帮助其他极客。 如果您发现任何不正确的地方,或者您想分享有关上述主题的更多信息,请写下评论。
© 版权声明
文章版权归作者所有,未经允许请勿转载。
THE END