信用卡号的合法性(JAVA)

题目描述:
在这里插入图片描述
在这里插入图片描述
思路:
练习一下函数的使用:
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
  • 4
    点赞
  • 21
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值