题目要求
(附加题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("这个卡号是无效的");
    }
    }
}
--------------------- 
作者:退堂鼓一级演员 
来源:CSDN 
原文:https://blog.csdn.net/yeweij226/article/details/89855907 
版权声明:本文为博主原创文章,转载请附上博文链接!

后面看到这个写的。。20多行写完也是6

https://www.cnblogs.com/liuzhen1995/p/6896199.html

转载自---课内实验记录|信用卡号的合法性检查 2019年05月05日 21:37:45 @退堂鼓一级演员相关推荐

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

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

  2. 【数据库系统原理】数据库课内实验

    说明:这是武汉理工大学计算机学院[数据库系统原理]课程课内实验. >>点击查看武汉理工大学计算机专业课程资料汇总 >>点击查看WUTer计算机专业实验汇总 谨记:纸上得来终觉浅 ...

  3. 武汉理工大学操作系统 课内实验

    文章目录 前言 主要仪器设备及耗材 一.动态分区管理 实验内容描述 实验基本原理与设计 二.磁盘调度 实验内容描述 实验基本原理与设计 总结 前言 操作系统课内实验有两个,验收的学姐人贼好,只看了验收 ...

  4. 武汉理工大学数值分析课内实验

    文章目录 前言 主要仪器设备及耗材 一.用C语言实现几个多项式插值的程序.(Lagrange插值.Newton插值) 实验内容描述 实验基本原理与设计 分析与设计 实验结果 二.用C语言实现几个求常微 ...

  5. webservice-UML课内实验报告实验三

    1.webservice 现将网上关于webservice的讲解提炼出来,通过一个最简单使用并且方便的例子,告诉大家什么是webservice. 简单来说,webservice就是远程调用技术,也叫X ...

  6. Java黑皮书课后题第6章:**6.31(金融应用:信用卡号的合法性验证)和**6.32 编写程序,提示用户输入一个long型整数的信用卡号码,显示这个数字是合法的还是非法的

    6.31(金融应用:信用卡号的合法性验证)编写程序,提示用户输入一个long型整数的信用卡号码,显示这个数字是合法的还是非法的 6.31题目 题目描述 破题 6.31代码 6.32 代码 运行实例 6 ...

  7. java 判断是否信用卡_《Java语言程序设计》编程练习6.31(财务应用程序:信用卡号的合法性)...

    6.31(财务应用程序:信用卡号的合法性)信用卡号遵循下面的模式.一个信用卡号必须是13到16位的整数.它的开头必须是: 4,指Visa卡 5,指Master卡 37,指American Expres ...

  8. epubbuilder 过期_记者调查|浠水县思源实验学校向学生发过期牛奶,生产日期2019年12月14日...

    楚天都市报11月2日讯(记者董淑健 通讯员魏学建) 生产日期2019年12月14日,保质期6个月.过期几个月的牛奶能喝吗?几天前,居然通过学校食堂发到了学生手中. 浠水县思源实验学校的一些学生家长对此 ...

  9. 关于服务器什么时候维护好8月20号,2019年8月20日定期维护公告

    原标题:2019年8月20日定期维护公告 2019年8月20日定期维护公告 亲爱的玩家朋友: 为保证服务器的运行稳定和服务质量,<梦幻西游>所有服务器将于2019年8月20日上午8:00停 ...

最新文章

  1. LTE: 系统内移动性知识点总结
  2. 北航c语言简答题目汇总_2020下半年至2021年【化学/计算机/生物类】国际竞赛汇总!...
  3. Redis源码剖析(十二)--客户端和服务器
  4. Kinect学习(六):提取人体关节点数据
  5. 在WPF 4.5中跨线程更新集合
  6. 32、[源码]-AOP原理-创建AOP代理
  7. AC日记——幸运号码 51nod 1043
  8. rhel6mysql管理_RHEL 6平台MySQL数据库服务器的安装方法
  9. IBatisNet初步体验
  10. oracle生成awr报告命令,oracle数据库生成awr报告
  11. SQL Server2012版完全卸载
  12. wps excel 操作指南
  13. JavaScript登录界面制作
  14. 计算机右键管理删除,win10系统删除右键菜单中“管理我的手机”的处理方法
  15. 跳跃表skiplist简析
  16. 数据可视化笔记8 层次数据可视化
  17. 苏州Uber优步司机奖励政策(8月31日至9月6日)
  18. nacos2.X集群错误:com.alibaba.nacos.shaded.io.grpc.StatusRuntimeException: UNAVAILABLE: io exception
  19. DOSBOX的简单使用
  20. ERR_REQUIRE_ESM

热门文章

  1. python爬虫网络安全的_基于Python网络爬虫实战 - 安全牛课堂 - 领先的信息安全在线教育平台...
  2. android ro.boot.mac,Android设备ro.boot.serialno的前世今生
  3. 【性能测试】功能简单的小说网站(Jmeter+fiddler实践)
  4. VSCODE 好看的亮色系主题,收藏起来
  5. 华为OD机试题 - 九宫格按键输入(JavaScript)| 机考必刷
  6. delphi cookie发送php,phpwind 论坛发贴POST提交!cookie 设置,该如何解决
  7. 还不知道音频格式转换mp3软件哪个好?进来看看就知道了
  8. uniapp 重力感应关闭
  9. linux 常用命令手册
  10. CentOS 8.0 安装docker 报错:Problem package docker-ce-3 19.03.4-3.el7.x86_64 require