题目描述:

信用卡号遵循下面的模式。一个信用卡号必须是13 到 16 位的整数。它的开头必须是:

  • 4,指 Visa 卡
  • 5,指 Master 卡
  • 37,指 American Express 卡
  • 6,指 Discover 卡

在 1954 年,IBM 的 Hans Luhn 提出一种算法,该算法可以验证信用卡号的有效性。这个算法在确定输入的卡号是否正确,或者这张信用卡是否被扫描仪正确扫描方面是非常有用的。遵循这个合法性检测可以生成所有的信用卡号,通常称之为 Luhn 检测或者 Mod10 检测,可以如下描述(为了方便解释,假设卡号为 4388576018402626):

1)从左到右对偶数位数字翻倍。如果对某个数字翻倍之后的结果是一个两位数,那么就将这两位加在一起得到一位数。

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 整除,那么卡号是合法的;否则,卡号是不合法的。例如,号码 4388576018402626 是不合法的,但是号码 4388576018410707 是合法的。编写程序,提示用户输入一个 long 型整数的信用卡号码,显示这个数字是合法的还是非法的。使用下面的方法设计程序:
下面是程序的运行示例:(你也可以通过将输入作为一个字符串输入,以及对字符串进行处理来验证信用卡卡号。)

代码:


import java.util.Scanner;public class Test12 {public static void main(String[] args) {Scanner in = new Scanner(System.in);System.out.println("Enter a credit card number as a long interger:");long number = in.nextLong();if(isValid(number))System.out.println(number + " is valid");elseSystem.out.println(number + " is invalid");in.close();}/** Return true if the card number is valid */public static boolean isValid(long number) {if(13 <= getSize(number) && getSize(number) <= 16)if(prefixMatched(number,4)||prefixMatched(number,5)||prefixMatched(number,37)||prefixMatched(number,6))if((sumOfDoublieEvenPlace(number) + sumOfOddplace(number)) % 10 == 0)return true;return false;}/** Get the result from Step 2 */public static int sumOfDoublieEvenPlace(long number) {String numberString = String.valueOf(number);int sum = 0;for(int i = 0; i < getSize(number); i += 2){sum +=  getDigit(2 * Integer.parseInt(String.valueOf(numberString.charAt(i))));}return sum;}/** Return this number if it is a single digit, otherwise,* return the sum of the two digits */public static int getDigit(int number) {if(number < 10)return number;return number % 10 + number / 10;}/** Return sum of odd-place digits in number */public static int sumOfOddplace(long number) {int sum = 0;while(true){if(number == 0)break;sum += number % 10;number /= 100;}return sum;}/** Return true if the digit d is a prefix for number * 如果数字d是number的前缀就返回true*/public static boolean prefixMatched(long number,int d) {if(d == getPrefix(number,getSize(d)))return true;return false;}/** Return the number of digits in d */public static int getSize(long d) {return String.valueOf(d).length();}/** Return the first k number of digits from number. If the* number of digits in number is less than k, return number.* 返回number的前k位数。如果number的位数少于k,返回number。*/public static long getPrefix(long number,int k) {if(getSize(number) < k)return number;long prefix = number;for(int i = 0; i < getSize(number) - k; i++){prefix /= 10;}return prefix;}}

运行结果:

结果一:

Enter a credit card number as a long interger:
4388576018410707
4388576018410707 is valid

结果二:

Enter a credit card number as a long interger:
4388576018402626
4388576018402626 is invalid

Java实验3 第十二题:财务应用程序:信用卡号的合法性相关推荐

  1. 第十二题:设int x=1,float y=2,则表达式x/y的值是:

    第十二题 设int x=1,float y=2,则表达式x/y的值是:() A 0 B 1 C 2 D 以上都不是 懵逼树上懵逼果,懵逼树下你和我 首先看到这道题,我是懵逼和绝望的. 首先我们打开评论 ...

  2. code第一部分数组:第二十二题 偶数次中查找单独出现一次的数

    code第一部分数组:第二十二题 偶数次中查找单独出现一次的数 Given an array of integers, every element appears twice except for o ...

  3. 经典算法题每日演练——第二十二题 奇偶排序

    原文:经典算法题每日演练--第二十二题 奇偶排序 这个专题因为各种原因好久没有继续下去了,MM吧...你懂的,嘿嘿,不过还得继续写下去,好长时间不写,有些东西有点生疏了, 这篇就从简单一点的一个&qu ...

  4. 程序设计第二十二题 空心三角形

    Problem Description 把一个字符三角形掏空,就能节省材料成本,减轻重量,但关键是为了追求另一种视觉效果.在设计的过程中,需要给出各种花纹的材料和大小尺寸的三角形样板,通过电脑临时做出 ...

  5. 第一章第十二题(以千米计的平均速度)(Average speed in kilometers)

    第一章第十二题(以千米计的平均速度)(Average speed in kilometers) 1.12(以千米计的平均速度)假设一个跑步者1小时40分35秒跑了24英里.编写一个程序显示以每小时多少 ...

  6. 第七章第二十二题(计算一个字符串中大写字母的数目)(Calculates the number of uppercase letters in a string)

    第七章第二十二题(计算一个字符串中大写字母的数目)(Calculates the number of uppercase letters in a string) *7.22(计算一个字符串中大写字母 ...

  7. 2020高考理科数学全国3卷:选择题第十二题解析

    这是2020年高考理科数学全国3卷的选择题第十二题 题目 已知 5 5 < 8 4 5^5< 8^4 55<84 , 1 3 4 < 8 5 13^4< 8^5 134& ...

  8. 猴子第一天摘下若干个桃子,当时吃了一半,又多吃了一个。以后每天早上都吃了前一天剩下的一半零一个谭浩强c语言第五章第十二题

    题目 本题是谭浩强<c语言程序设计>第五章第十二题 题目:猴子第一天摘下若干个桃子,当时吃了一半,又多吃了一个.以后每天早上都吃了前一天剩下的一半零一个.到第10天早上再想吃时,就只剩一个 ...

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

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

最新文章

  1. SOA标准发展混乱 国内业务缺少经验
  2. 克服游戏运营中IB的长尾挑战
  3. YYH的苍天大竹(NOIP模拟赛Round 6)
  4. php权限二进制,PHP_二进制交叉权限微型php类分享,靓点:1、多对多交叉场景分配 - phpStudy...
  5. 一个游戏美术写给策划的快速入门(二)
  6. JS获取页面中Url的某个参数
  7. python输出字母金字塔可以输入字母和行数的_python实现输入任意一个大写字母生成金字塔的示例...
  8. Python中的split()和rsplit()的使用
  9. python不定长的参数*,**使用(三分钟读懂)
  10. Mimikatz 攻防杂谈
  11. IGP-LAB-EIGRP-1
  12. 群晖 VMM虚拟机安装openwrt软路由做单臂旁路由
  13. (Java实现) 光荣的梦想
  14. SDN控制器测试专题一:基础知识篇
  15. Java--字符串反转函数
  16. 45 | chmod命令
  17. word中删除脚注中的横线
  18. 黑群引导制作及系统安装(文后附软件包)
  19. 样条函数 -- spline function
  20. bacnet协议--BAC0使用

热门文章

  1. PN532半加密、无漏洞卡解密
  2. opencv打开摄像头失败的一种可能cv2.error: Unknown C++ exception from OpenCV code
  3. 怎么编辑PDF文件?分享三种好用的编辑方法
  4. Java String 真的是不可变的吗
  5. 爬虫攻守道 - 2023最新 - Python Selenium 实现 - 数据去伪存真,正则表达式谁与争锋 - 爬取某天气网站历史数据
  6. python3 规则引擎_Ilog、Drools、Jess规则引擎的Rule Language 对比
  7. 正点原子DS100手持示波器测试记录
  8. 多路测量实时同步工作原理_数字示波器原理
  9. outlook规则导出_如何在Outlook和Gmail之间导入和导出联系人
  10. 基本模型计算机框架原理设计 题目分析,计算机销售论文大纲模板 计算机销售论文框架怎么写...