文章目录
- 前言
- 一、流程与步骤
- 二、代码部分
- 1.先写出方法头,构建一个具体框架
- 2.模块化解释
- 三、完整代码
前言
纯萌新,花了一个下午做出这道题来,颇有感悟写一下心得。完整的代码在最后面,欢迎交流和提问
一、流程与步骤
首先仔细读题,初步在脑中完成一个思维导图。
然后将其写下来:
不用非常清楚,能想到什么问题就写上去,把问题整体模块化,复杂简单化。
二、代码部分
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;
}
- 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;
}
}
}