luhn校验算法(Java实现)

      The Luhn algorithm or Luhn formula, also known as the "modulus 10" or "mod 10" algorithm, is a simple checksum formula used to validate a variety of identification numbers, such as credit card numbersIMEI numbersNational Provider Identifier numbers in US and Canadian Social Insurance Numbers. It was created by IBM scientist Hans Peter Luhn and described in U.S. Patent No. 2,950,048, filed on January 6, 1954, and granted on August 23, 1960.——来自维基百科(http://en.wikipedia.org/wiki/Luhn_algorithm)。

案例

当你输入信用卡号码的时候,有没有担心输错了而造成损失呢?其实可以不必这么担心,因为并不是一个随便的信用卡号码都是合法的,它必须通过Luhn算法来验证通过。

该校验的过程:

1、从卡号最后一位数字开始,逆向将奇数位(135等等)相加。

2、从卡号最后一位数字开始,逆向将偶数位数字,先乘以2(如果乘积为两位数,则将其减去9),再求和。

3、将奇数位总和加上偶数位总和,结果应该可以被10整除。

例如,卡号是:5432123456788881

则奇数、偶数位(用红色标出)分布:5432123456788881

奇数位和=35

偶数位乘以2(有些要减去9)的结果:16 2 6 1 5 7 7,求和=35

最后35+35=70可以被10整除,认定校验通过。

import java.util.Scanner;

//信用卡号校验算法
public class Luhn {
	public static void main(String[] args) {
		System.out.println("Please input your credit card number:");
		Scanner input = new Scanner(System.in);
		int sumOdd = 0;
		int sumEven = 0;
		String number = input.next();
		int length = number.length();
		int[] wei = new int[length];
		for (int i = 0; i < number.length(); i++) {
			wei[i] = Integer.parseInt(number.substring(length - i - 1, length
					- i));// 从最末一位开始提取,每一位上的数值
			System.out.println("第" + i + "位数字是:" + wei[i]);
		}
		for (int i = 0; i < length / 2; i++) {
			sumOdd += wei[2 * i];
			if ((wei[2 * i + 1] * 2) > 9)
				wei[2 * i + 1] = wei[2 * i + 1] * 2 - 9;
			else
				wei[2 * i + 1] *= 2;
			sumEven += wei[2 * i + 1];
		}
		System.out.println("奇数位的和是:" + sumOdd);
		System.out.println("偶数位的和是:" + sumEven);
		if ((sumOdd + sumEven) % 10 == 0)
			System.out.println("Recept.");
		else
			System.out.println("Can not recept.");
	}
}

运行结果:

Please input your credit card number:
5432123456788881
第0位数字是:1
第1位数字是:8
第2位数字是:8
第3位数字是:8
第4位数字是:8
第5位数字是:7
第6位数字是:6
第7位数字是:5
第8位数字是:4
第9位数字是:3
第10位数字是:2
第11位数字是:1
第12位数字是:2
第13位数字是:3
第14位数字是:4
第15位数字是:5
奇数位的和是:35
偶数位的和是:35
Recept.


你可能感兴趣的:(java,Algorithm,算法,String,input,Numbers)