题目描述:
思路:
练习一下函数的使用:
isValid 判断整个卡号是否有效
sumOfDoubleEvenPlace 基于规则,计算偶数位数的数字和
sumOfDoubleOddPlace 基于规则,计算奇数位数的数字和
getDigit 计算输入数字的每位数字的和,输入数字可能为1位或者2位
==prefixMatched ==判断输入的信用卡号,是否匹配d要求的前缀
getSize 返回输入数字的位数
getPrefix 返回信用卡号的前k位,以便与前缀进行一一匹配
代码:
package Practice;
import java.util.Scanner;
public class Ch06Q31 {
public static void main(String[] args) {
Scanner input = new Scanner(System.in);
while(true)
{
System.out.print("Enter a credit card number as a long integer: ");
long number = input.nextLong();
if (isValid(number))
System.out.println(number + " is valid");
else
System.out.println(number + " is invalid");
}
}
public static boolean isValid(long number) {// 长度、前缀、数字特性的合法性检查
return (getSize(number) >= 13) && (getSize(number) <= 16) &&
(prefixMatched(number, 4) || prefixMatched(number, 5) ||
prefixMatched(number, 6) || prefixMatched(number, 37)) &&
(sumOfDoubleEvenPlace(number) + sumOfOddPlace(number)) % 10 == 0;
}
// 从右往左的偶数位,按要求求和
public static int sumOfDoubleEvenPlace(long number) {
int result = 0;
number = number / 10;
while (number != 0) {
result += getDigit((int)((number % 10) * 2));
number = number / 100;
}
return result;
}
// 求偶数位的数性质时,需要对求和的数再进行各位求和处理
public static int getDigit(int number) {
return number % 10 + (number / 10);
}
// 从右往左的奇数位,按要求求和
public static int sumOfOddPlace(long number) {
int result = 0;
while (number != 0) {
result += (int)(number % 10);
number = number / 100;
}
return result;
}
// 取标准前缀对应大小的该数字的前缀,与对应的标准前缀进行匹配
public static boolean prefixMatched(long number, int d) {
return getPrefix(number, getSize(d)) == d;
}
//得到数字的长度,便于后来取前缀
public static int getSize(long d) {
int numberOfDigits = 0;
while (d != 0) {
numberOfDigits++;
d = d / 10;
}
return numberOfDigits;
}
// 取前缀,k可取标准前缀的长度:getSize(d)
public static long getPrefix(long number, int k) {
long result = number;
for (int i = 0; i < getSize(number) - k; i++)
result /= 10;
return result;
}
}
//4388576018410707
//4388576018402626
//4005550000000019
//5105105105105100
//5555555555554444
//4222222222222
//4111111111111111
//4012888888881881
//378282246310005
//371449635398431
//378734493671000
//6011111111111117
//6011000990139424
//invalid
//38520000023237
//30569309025904
//3530111333300000
//3566002020360505