《Java语⾔程序设计》编程练习6.31(财务应⽤程序:信⽤卡号
的合法性)
6.31(财务应⽤程序:信⽤卡号的合法性)信⽤卡号遵循下⾯的模式。⼀个信⽤卡号必须是13到16位的整数。它的开头必须是:
4,指Visa卡
5,指Master卡
37,指American Express卡
6,指Discover卡
在1954年,IBM的Hans Luhn提出⼀种算法,该算法可以验证信⽤卡号的有效性。这个算法在确定输⼊的卡号是否正确,或者这张信⽤卡号是否被扫描仪正确扫描⽅⾯是⾮常有⽤的。遵循这个合法性检测可以⽣成所有的信⽤卡号,通常称之为Luhn检测或者Mod 10检测,可以如下描述(为了⽅便解释,假设卡号为4388576018402626):
1)从右到左对每个数字翻倍。如果对某个数字翻倍之后的结果是⼀个两位数,那么就将这两位加在⼀起得到⼀位数。
2) 现在将第⼀步得到的所有⼀位数相加。
4+4+8+2+3+1+7+8=37
violetta3) 将卡号⾥从右到左在奇数位上的所有数字相加。
6+6+0+8+0+7+8+3=38
4) 将第⼆步和第三步得到的结果相加。
37+38=75
5) 如果第四步得到的结果能被10整除,那么卡号是合法的;否则,卡号是不合法的。例
如,号码4388576018402626是不合法的,但是号码4388576018410707是合法的。
编写程序,提⽰⽤户输⼊⼀个long型整数的信⽤卡号码,显⽰这个数字是合法的还是⾮法
的。使⽤下⾯的⽅法设计程序:
1/** Returntrue if the card number is valid */
2public static boolean isVa1id(long number)
3
4/** Getthe result from Step2 */
5public static int sumOfDoubleEvenPIace(long number)
6/** Return this number if it is a single digit, otherwi,
7* return the sum of the two digits*/
8public static int getDigit(int number)
9/** Returnsum ofodd-placedigitsin number */
10public static int sumOfOddPlace(1ong number)
11/** Returntrue if the digitd is a prefix for number */
12public static boolean prefixMatched(1ong number, int d)
13/** Returnthe number ofdigitsin d */
14public static int getSize(1ong d)
15/** Return the first k number ofdigitsfrom number. If the
16* number ofdigitsin number is less than k, return number. */
17public static long getPrefix(long number, int k)
下⾯是程序的运⾏⽰例:(你也可以通过将输⼈作为⼀个宇符串读⼈,以及对宇符串进⾏处
理来验证信⽤卡卡号。
以下为实现这功能的代码:
1/** fileName: creditCardVerify.java
2 * 作⽤: 计算信⽤卡号的合法性
3 * mail:
4 * 说明:信⽤卡号必须是13到16位,开头必须是4,5,37,6
5 *
6*/
7
8import java.util.Scanner;
9
10public class creditCardVerify{
11public static void main(String[] args) {
12 Scanner input = new Scanner(System.in);
13 System.out.print("请输⼊卡号,按Enter结束输⼊: ");
全国统考 单独考试
14long i = Long();
15if (isValid(i))
16 System.out.println(i + " is valid");
17el
18 System.out.println(i + " is invalid");
19 }
20
21/** Return true if the card number is valid */
22/** 返回ture表明这个卡号是有效的 */
23public static boolean isValid(long number) {
24if(prefixMatched(number)){
25if(sumOfdoubleEvenPlace(number)%10 == 0)
26return true;
27 }
28return fal;
29 }
30
31/**
32 * Get the result from Step 2 从步骤2得到结果?。双重偶数之和
33*/
34public static int sumOfdoubleEvenPlace(long number) {
35int sum = 0;
36int sumGetdigit = 0;
37long temp = 0;
38int numberSize = getSize(number);
39for(int i =2; i <= numberSize; i += 2){
40 temp = getPrefix(number, i);
41 sumGetdigit += getDigit((int)temp*2);
全职英语翻译
42 }
43 sum = sumGetdigit + sumOfOddPlace(number);
44return sum;
45 }
46
47/**
48 * Retrun this number if it is a single digit, otherwi, Return the sum of the
49 * two digits
50 *
51 * 如果是单个数字,则返回该数字,否则返回两位数的和。获得数字
52*/
53public static int getDigit(int number) {
delete是什么意思54int numGetDigit = 0;
55if(number % 10 >= 0){
56 numGetDigit = number % 10;
57 number /= 10;
58 numGetDigit += number;
59return numGetDigit;
60 }
61return number;
62 }
63
64/**
65 * Return sum of odd-place digits in number 返回卡号总右往左的奇位数之和 66*/
67public static int sumOfOddPlace(long number) {
68int sum = 0, i = 0;
69int Size = getSize(number);
70
71for(i = 1; i <= Size; i+=2){
72 sum += getPrefix(number, i);
73 }
74return sum;
75 }
眼睛化妆
76
77/**
78 * Return true if the digit d is a prefix for number 判断卡号的前缀是否合法 79*/
80public static boolean prefixMatched(long number) {
81int numberSize = getSize(number);
82if(numberSize >= 13 && numberSize <= 16){
83switch((int)getPrefix(number, numberSize)){
84ca 4: return true;
85ca 5: return true;
86ca 6: return true;
87ca 3: if((int)getPrefix(number, numberSize -1) == 7)
88return true;
89 }
90 }
91return fal;
cappuccino什么意思92 }
everymomentofmylife93
94/** Return the number of digits in d
95 * 获得信⽤卡号的长度并将结果返回
96*/
97public static int getSize(long d){
98long i= 0;
99while(d > 0){
100 i += 1;
101 d /= 10;
102 }
103return (int)i;
104 }
aureole105
106/** Return the first k number of digits from number. If the
107 * Number of digits in number is less than k, return number.
brent108 * 从数字中返回第⼀个k位数。如果数字总的位数⼩于k,则返回数字。109 * 应该是获得信⽤卡号的第k位的字母
110*/
111public static long getPrefix(long number, int k){
112int i = 0;
113long temp=0;
114while (i < k){glassfish
115 i++;
116 temp = number % 10;
117 number /= 10;
118 }
119return temp;
120 }
121 }