课内实验记录|信用卡号的合法性检查

题目要求

(附加题6.31 信用卡号的合法性,可选做)
信用卡号遵循下面的模式。一个信用卡号必须是13-16位的整数。它的开头必须是:
4,指visa卡
5,指master卡
37,指American Express卡
6,指Discovery卡

在1954年,IBM的Hans Luhn提出一种算法,该算法可以验证信用卡号的有效性。这个算法在确定输入的卡号是否正确,或者这张信用卡是否能被正确扫描是非常有用的。该方法通常被称为Luhn检测或Mod10 检测,描述如下(假设卡号是4388576018402626)
(1)从右至左对偶数位上的数字翻倍。如果数字翻倍后是一个两位数,那么就将这两位加在一起得到一位数。
2 * 2 =4
2 * 2=4
4 * 2=8
1 * 2=2
6 * 2=12(1+2=3)
5 * 2=10(1+0=1)
8 * 2=16(1+6=7)
4 * 2=8
(2)将第一步得到的所有一位数相加。
4+4+8+2+3+1+7+8=37
(3)将卡号里从右往左奇数位上所有数字相加。
6+6+0+8+0+7+8+3=38
(4)将第二步和第三步得到的结果相加。
37+38=75
(5)如果第四步得到的结果能被10整除,则卡号是合法的,否则是不合法的。
75%10 !=0

编写程序,提示用户输入一个long型整数的信用卡号码,显示这个数字是合法还是非法的。使用下面的方法设计程序:

/Return true if the card number is valid/
public static boolean isValid(long number)

/Get the result from step 2/
public static int sumOfDoubleEvenPlace(long number)

/Return this number if it is a single digit, otherwise return the sum of the two digits/
public static int getDigit(int number)

/Return sum of odd place digits in number/
public static int sumOfOddPlace(long number)

/Return true if the digit d is a prefix for number/
public static boolean prefixMatched(long number, int d)(这个费了死劲也没用上=.=)

/Return the number of digits in d/
public static int getSize(long d)

/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)

实验报告内容

1.实验运行

首先根据提示输入一个长整型的信用卡号
在这里插入图片描述
再输入信用卡号
在这里插入图片描述
如果信用卡不合法,提示不合法

在这里插入图片描述
如果信用卡合法,提示合法
在这里插入图片描述
如果输入无效,提示输入无效
在这里插入图片描述

2.结果分析

A.实验思路

主函数思路:
根据提示输入长整型信用卡号,先判定是否有效,再对信用卡号的反偶数位和反奇数位求和并判断是否整除10,输出结果;
getSize函数思路:
先取count 为1,在信用卡号除10非0时每存在一次计数器加一,直到除尽,然后返回count;
getPrefix函数思路:
对输入的前缀的位数,减去getSize的长度数并减去前缀数,然后除10操作其次数次,得到的结果即为prefix;
isValid函数思路:
判断长度:13-16位,调用getSize函数
判断前缀:3,4,5,37,调用getPrefix函数
getDigit函数思路:
对输入的数判断,如果大于10,将num % 10 + 1的结果返回(即将两位的数字相加,十位数字一定是1);否则返回原值
sumOfDoubleEvenPlace函数思路:
首先除10到第二位;
然后模10取最后一位,判断是否是两位数(调用getDigit函数),返回值后将其加到sum上,除去100得到下两位的数,重复操作直到除尽,返回sum;
sumOfOddPlace函数思路:
同sumOfDoubleEvenPlace函数思路但不用进行getDigit判断

B.实验改进

使用while(true),break结构实现长时间处理,输入0时结束操作;

3.源代码

**Experiment5**
import java.util.Scanner;

public class experiment5 {
	/*Return the number of digits in d*/
	public static int getSize(long d){
		int count = 1;
		while(d / 10 != 0){
			d /= 10;
			count++;
		}
		return count;
	}
	/*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){
		int index = getSize(number) - k;
		for(int i =0; i < index;i++)number /= 10;
		return number;
	}
	
	/*Return true if the card number is valid*/
	public static boolean isValid(long number){
		if(getSize(number)>= 13 && getSize(number)<= 16 && (getPrefix(number, 1) == 4 || getPrefix(number, 1)== 5 || getPrefix(number, 1)== 6 || getPrefix(number, 2)==37))
			return true;
		else return false;
	}
	/*Return this number if it is a single digit, otherwise return the sum of the two digits*/
	public static int getDigit(int number){
		int re = 0;
		if(number >= 10){
			re = number % 10 + 1;
		}
		else re = number;
		return re;
	}
	
	/*Get the result from step 2*/
	public static int sumOfDoubleEvenPlace(long number){
		number /= 10;
		int sum = 0;
		while(number != 0){
			int temp = (int) (number % 10 * 2);
			sum += getDigit(temp);
			number /= 100;
		}
		return sum;
	}
	
	/*Return sum of odd place digits in number*/
	public static int sumOfOddPlace(long number){
		int sum = 0;
		while(number != 0){
			sum += number % 10;
			number /= 100;
		}
		return sum;
	}
	


	
	public static void main(String[] args){
		//持续输入
		while(true){
		Scanner input = new Scanner(System.in);
		System.out.println("请输入一个长整型的信用卡号,以0结束");
		long num = input.nextLong();
		if(num == 0){ 
			System.out.println("程序结束");
			break;
		}
		int size = getSize(num);
		//当有效时,将奇偶数结果相加进行判断
		if(isValid(num)){
			int sum1 = sumOfDoubleEvenPlace(num);
			int sum2 = sumOfOddPlace(num);
			int sum = sum1+sum2;
			if(sum % 10 == 0)System.out.println("这个卡号是合法的");
			else System.out.println("这个卡号是不合法的");		
		}
		//当无效时,提示
		else System.out.println("这个卡号是无效的");
	}
	}
}
发布了36 篇原创文章 · 获赞 11 · 访问量 2917

猜你喜欢

转载自blog.csdn.net/yeweij226/article/details/89855907
今日推荐