信用卡号的合法性验证-Java基础篇第六章编程练习题第31题


前言

纯萌新,花了一个下午做出这道题来,颇有感悟写一下心得。完整的代码在最后面,欢迎交流和提问


一、流程与步骤

首先仔细读题,初步在脑中完成一个思维导图。
然后将其写下来:在这里插入图片描述
不用非常清楚,能想到什么问题就写上去,把问题整体模块化,复杂简单化。

二、代码部分

1.先写出方法头,构建一个具体框架

代码如下(示例):
在这里插入图片描述
这样初步把代码模块化,方便你编辑,并且验证局部方法的时候只用在其他方法前面加“//”将其注释化,这样就不会出现前面的代码没错写了后面出现错误的问题了。我没有完全按照题目上给出的方法写,我总体的思路是将卡号以字符串类型输入,然后对字符串进行处理达到题目要求。

2.模块化解释

这里我把函数按我当时编写时遇到的困难分成四个部分:
1. 主函数代码

public static void main(String[] args) {
   	Scanner input = new Scanner(System.in);
   	String card_number;
   	getInformation();
   	card_number = input.next();
   	
   	if(isValid(card_number))
   	{
   		System.out.println( "考号为" + card_number +"银行卡合法。");
   		System.out.println(sumOfOddPlace(card_number));
   	}
   	else 
   	{
   		System.out.println("银行卡不合法。");
   	}
   	

   }

2.调用后面函数进行总体判断是否为合法银行卡号

public static boolean isValid(String number)                                  //判断输入的数字是符合银行卡规定
	{
		int size;
		size = getSize(number);
		if(size >= 13 && size <= 16 && prefixMatched(number) && sumOfOddAndEven(sumOfOddPlace(number),sumOfDoubleEvenPlace( number))	)
		{
			return true;
		}
		else
			return false;
 	}

3.判断前缀是否为银行卡

public static boolean prefixMatched(String number)							//银行卡前缀判断
	{
		int prefix =number.charAt(0);
		int secend_prefix = number.charAt(1);
		prefix -= 48;
		secend_prefix -= 48;
		if(prefix == 4 || prefix == 5 || prefix == 6)
		{
			return true;
		}
		else if(prefix == 3)
		{
			if(secend_prefix == 7)
				return true;
			else
				return false;
		}
		else
			return false;
	}
  1. Luhn检测
public static  int sumOfDoubleEvenPlace(String number)         //返回从右到左对偶数位数字翻倍,然后将所得所有一位数相加的和
	{
		int sum = 0,even=0,size,even_size;
		size = getSize(number);
		even_size = (getSize(number)) / 2;
		for(int i = 0; i < even_size ; i++  )
		{																											//运用字符类型的数字参与整型类型的数字进行计算
			even = number.charAt(size - 2) - 48;										//这里减去48 是因为asc码值里“0”的asc码值是48,将字符类型的数字减去48,就可以得到整型了
			sum +=  number_double(even);
			size -=2;
		}
		return sum;
		 
	}

	public static int number_double(int even)										//返回翻倍后的数字
	{
		int double_even,i,j;
		double_even = even * 2;
		if(double_even >= 10)																//翻倍后数字是两位处理为一位
		{
			i = 1;
			j = double_even -10;
			double_even = i + j;
			return double_even;
		}
		else
			return double_even;
		
	}
	
	public static int sumOfOddPlace(String number)                           //卡号中从右到左奇数位的每位的数字之和
	{
		int size,odd,odd_size = 0,sum = 0;
		size = getSize(number);
		odd_size = size - (getSize(number)) / 2;			//获取奇数位的个数
		for(int i = 0; i < odd_size ; i++)
		{
			odd = number.charAt(size -1) - 48;		//运用字符类型的数字参与整型类型的数字进行计算
			sum += odd;															//这里减去48 是因为asc码值里“0”的asc码值是48,将字符类型的数字减去48,就可以得到整型了
			size -= 2;
			
		}
		
		return sum;
	}
	
	public static boolean sumOfOddAndEven(int sum_odd, int sum_even)  //奇数位和偶数位相加判读是否合法
	{
		int sum = sum_odd + sum_even;
		if(sum % 10 == 0)
		{
			return true;
		}
		else {
			return false;
		}
		
	}
	

三、完整代码

import java.util.Scanner;
public class VerifyBankCard_31 {

	public static void main(String[] args) {
		Scanner input = new Scanner(System.in);
		String card_number;
		getInformation();
		card_number = input.next();
		
		if(isValid(card_number))
		{
			System.out.println( "考号为" + card_number +"银行卡合法。");
			System.out.println(sumOfOddPlace(card_number));
		}
		else 
		{
			System.out.println("银行卡不合法。");
		}
		

	}
	
	public static void getInformation()										//提示用户输入卡号
	{
		
		System.out.println("请输入银行卡卡号(13-16位整数):");
		
		
	}

 	public static boolean isValid(String number)                                  //判断输入的数字是符合银行卡规定
	{
		int size;
		size = getSize(number);
		if(size >= 13 && size <= 16 && prefixMatched(number) && sumOfOddAndEven(sumOfOddPlace(number),sumOfDoubleEvenPlace( number))	)
		{
			return true;
		}
		else
			return false;
 	}
 	
	public static boolean prefixMatched(String number)							//银行卡前缀判断
	{
		int prefix =number.charAt(0);
		int secend_prefix = number.charAt(1);
		prefix -= 48;
		secend_prefix -= 48;
		if(prefix == 4 || prefix == 5 || prefix == 6)
		{
			return true;
		}
		else if(prefix == 3)
		{
			if(secend_prefix == 7)
				return true;
			else
				return false;
		}
		else
			return false;
	}
	
	public static int getSize(String number)    				      					//返回银行卡长度		    		
	{
		int Size; 
				Size = number.length();
		return Size;
	}
	
	public static  int sumOfDoubleEvenPlace(String number)         //返回从右到左对偶数位数字翻倍,然后将所得所有一位数相加的和
	{
		int sum = 0,even=0,size,even_size;
		size = getSize(number);
		even_size = (getSize(number)) / 2;
		for(int i = 0; i < even_size ; i++  )
		{																											//运用字符类型的数字参与整型类型的数字进行计算
			even = number.charAt(size - 2) - 48;										//这里减去48 是因为asc码值里“0”的asc码值是48,将字符类型的数字减去48,就可以得到整型了
			sum +=  number_double(even);
			size -=2;
		}
		return sum;
		 
	}

	public static int number_double(int even)										//返回翻倍后的数字
	{
		int double_even,i,j;
		double_even = even * 2;
		if(double_even >= 10)																//翻倍后数字是两位处理为一位
		{
			i = 1;
			j = double_even -10;
			double_even = i + j;
			return double_even;
		}
		else
			return double_even;
		
	}
	
	public static int sumOfOddPlace(String number)                           //卡号中从右到左奇数位的每位的数字之和
	{
		int size,odd,odd_size = 0,sum = 0;
		size = getSize(number);
		odd_size = size - (getSize(number)) / 2;						//获取奇数位的个数
		for(int i = 0; i < odd_size ; i++)
		{
			odd = number.charAt(size -1) - 48;					//运用字符类型的数字参与整型类型的数字进行计算
			sum += odd;															//这里减去48 是因为asc码值里“0”的asc码值是48,将字符类型的数字减去48,就可以得到整型了
			size -= 2;
			
		}
		
		return sum;
	}
	
	public static boolean sumOfOddAndEven(int sum_odd, int sum_even)  //奇数位和偶数位相加判读是否合法
	{
		int sum = sum_odd + sum_even;
		if(sum % 10 == 0)
		{
			return true;
		}
		else {
			return false;
		}
		
	}
	
}
		
		
  • 2
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值