6.31(财务应用程序:信用卡号的合法性)信用卡号遵循下面的模式。一个信用卡号必须是13到16位的整数。它的开头必须是:

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

在1954年,IBM的Hans Luhn提出一种算法,该算法可以验证信用卡号的有效性。这个算法在确定输入的卡号是否正确,或者这张信用卡号是否被扫描仪正确扫描方面是非常有用的。遵循这个合法性检    测可以生成所有的信用卡号,通常称之为Luhn检测或者Mod 10检测,可以如下描述(为了方便解释,假设卡号为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型整数的信用卡号码,显示这个数字是合法的还是非法
的。使用下面的方法设计程序:

 /** Returntrue if the card number is valid */
public static boolean isVa1id(long number) /** Getthe result from Step2 */
public static int sumOfDoubleEvenPIace(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)
/** Returnsum ofodd-placedigitsin number */
public static int sumOfOddPlace(1ong number)
/** Returntrue if the digitd is a prefix for number */
public static boolean prefixMatched(1ong number, int d)
/** Returnthe number ofdigitsin d */
public static int getSize(1ong d)
/** Return the first k number ofdigitsfrom number. If the
* number ofdigitsin number is less than k, return number. */
public static long getPrefix(long number, int k) 

下面是程序的运行示例:(你也可以通过将输人作为一个宇符串读人,以及对宇符串进行处
理来验证信用卡卡号。

以下为实现这功能的代码:

 /**     fileName:   creditCardVerify.java
* 作用: 计算信用卡号的合法性
* mail: xuangliang1@live.com
* 说明: 信用卡号必须是13到16位,开头必须是4,5,37,6
*
*/ import java.util.Scanner; public class creditCardVerify{
public static void main(String[] args) {
Scanner input = new Scanner(System.in);
System.out.print("请输入卡号,按Enter结束输入: ");
long i = input.nextLong();
if (isValid(i))
System.out.println(i + " is valid");
else
System.out.println(i + " is invalid");
} /** Return true if the card number is valid */
/** 返回ture表明这个卡号是有效的 */
public static boolean isValid(long number) {
if(prefixMatched(number)){
if(sumOfdoubleEvenPlace(number)%10 == 0)
return true;
}
return false;
} /**
* Get the result from Step 2 从步骤2得到结果?。双重偶数之和
*/
public static int sumOfdoubleEvenPlace(long number) {
int sum = 0;
int sumGetdigit = 0;
long temp = 0;
int numberSize = getSize(number);
for(int i =2; i <= numberSize; i += 2){
temp = getPrefix(number, i);
sumGetdigit += getDigit((int)temp*2);
}
sum = sumGetdigit + sumOfOddPlace(number);
return sum;
} /**
* Retrun this number if it is a single digit, otherwise, Return the sum of the
* two digits
*
* 如果是单个数字,则返回该数字,否则返回两位数的和。获得数字
*/
public static int getDigit(int number) {
int numGetDigit = 0;
if(number % 10 >= 0){
numGetDigit = number % 10;
number /= 10;
numGetDigit += number;
return numGetDigit;
}
return number;
} /**
* Return sum of odd-place digits in number 返回卡号总右往左的奇位数之和
*/
public static int sumOfOddPlace(long number) {
int sum = 0, i = 0;
int Size = getSize(number); for(i = 1; i <= Size; i+=2){
sum += getPrefix(number, i);
}
return sum;
} /**
* Return true if the digit d is a prefix for number 判断卡号的前缀是否合法
*/
public static boolean prefixMatched(long number) {
int numberSize = getSize(number);
if(numberSize >= 13 && numberSize <= 16){
switch((int)getPrefix(number, numberSize)){
case 4: return true;
case 5: return true;
case 6: return true;
case 3: if((int)getPrefix(number, numberSize -1) == 7)
return true;
}
}
return false;
} /** Return the number of digits in d
* 获得信用卡号的长度并将结果返回
*/
public static int getSize(long d){
long i= 0;
while(d > 0){
i += 1;
d /= 10;
}
return (int)i;
} /** Return the first k number of digits from number. If the
* Number of digits in number is less than k, return number.
* 从数字中返回第一个k位数。如果数字总的位数小于k,则返回数字。
* 应该是获得信用卡号的第k位的字母
*/
public static long getPrefix(long number, int k){
int i = 0;
long temp=0;
while (i < k){
i++;
temp = number % 10;
number /= 10;
}
return temp;
}
}

《Java语言程序设计》编程练习6.31(财务应用程序:信用卡号的合法性)的更多相关文章

  1. Java语言程序设计-助教篇

    1. 给第一次上课(软件工程)的老师与助教 现代软件工程讲义 0 课程概述 给学生:看里面的第0个作业要求 2. 助教心得 美国视界(1):第一流的本科课堂该是什么样?(看里面的助教部分) 助教工作看 ...

  2. 《JAVA语言程序设计》上课笔记

    教学目标:1.使学生了解JAVA课程的性质.定位.作用:为什么要学习JAVA?让学生知道如何学好JAVA: 教学内容: 一.        问几个问题 1.             你们到这里来干什么 ...

  3. Java语言程序设计复习提纲

     这是我在准备Java考试时整理的提纲,如果是通过搜索引擎搜索到这篇博客的师弟师妹,建议还是先参照PPT和课本,这个大纲也不是很准确,自己总结会更有收获,多去理解含义,不要死记硬背,否则遇到概念辨析题 ...

  4. 0031 Java学习笔记-梁勇著《Java语言程序设计-基础篇 第十版》英语单词

    第01章 计算机.程序和Java概述 CPU(Central Processing Unit) * 中央处理器 Control Unit * 控制单元 arithmetic/logic unit /ə ...

  5. 全国计算机等级考试二级笔试样卷Java语言程序设计

    一.选择题((1)-(35)每小题2分,共70分) 下列各题A).B).C).D)四个选项中,只有一个选项是正确的,请将正确选项涂写在答题卡相应位置上,答在试卷上不得分. (1)下列选项中不符合良好程 ...

  6. Java语言程序设计(基础篇)第一章

    第一章 计算机.程序和Java概述 1.1 引言 什么是程序设计呢? 程序设计就是创建(或者开发)软件,软件也称为程序. 1.2 什么是计算机 计算机是存储和处理数据的电子设备,计算机包括硬件(har ...

  7. java语言程序设计(一)-1

    java 语言的特点是: 强类型,制定了比较多的语言规范,尽可能在编译阶段检测出更多的错误及警告. 编译和解释,首先将源代码编译成codebyte,运行时,java的运行系统装载和链接需要执行的类,并 ...

  8. JAVA语言程序设计课程评价

    紧张的又短暂的一个学期结束了,这个学期也许将成为我人生中一个重要的转折点,作为一名半路出家的选手,在初次了解Java语言时我感到非常的迷茫与不知所措.因为之前很多同学都是通过假期时间在家自学,刚转入新 ...

  9. 《java 语言程序设计》第3、4章编程练习

    3.1 public class test { public static void main(String[] args) { System.out.println("Enter a, b ...

随机推荐

  1. CF - 1131 D Gourmet choice

    题目传送门 先把 = 的人用并查集合并在一起. 然后 < > 的建边, 跑一遍 toposort 之后就好了. 入度为0点的值肯定为1, 然后就是因为这个是按照时间线走过来的,所以一个点的 ...

  2. codeforces 816 C. Karen and Game(模拟+思维)

    题目链接:http://codeforces.com/contest/816/problem/C 题意:给出一个矩阵,问能否从都是0的情况下只将一整行+1或者一整列+1变形过来,如果可以输出需要步数最 ...

  3. 调用arcpy包批量进行矢量掩膜提取

    使用一个polygon矢量提取某个文件夹中所有的tif格式栅格数据 (要确保先安装好arcpy包) import arcpy arcpy.CheckOutExtension("spatial ...

  4. python 整型、字符串常用方法、for循环

    整型--int 定义:用于比较和计算 python2和python3: python2:python2中油int(整型)和long(长整型):1231312L+ 进制转换: 十进制转二进制:正除2,获 ...

  5. JS-特效 ~ 03. 楼层跳跃、事件对象event的获取与使用、event的主要内容、screenX、pageX、clientX的区别、放大镜、模拟滚动条

    楼层跳跃 100%子盒子会继承父盒子的宽高.父盒子继承body宽高.Body继承html的宽高. 盒子属性:auto:适应盒子自身的宽度或者高度.(对自己负责) 盒子属性:100%:适应盒子父盒子的宽 ...

  6. java中父类子类静态代码块、构造代码块执行顺序

    父类静态(代码块,变量赋值二者按顺序执行) 子类静态 父类构造代码块 父类构造方法 子类构造代码块 子类构造方法 普通方法在实列调用的时候执行,肯定位于上面之后了 //父类A public class ...

  7. PHP如何解决表单重复提交

    利用session   表单隐藏域中存放session(表单被请求时生成的标记).采用此方法在接收表单数据后,检查此标志值是否存在,先进行删除,然后处理数据; 若不存在,说明已提交过,忽略本次提交. ...

  8. Java中ElasticSearch的删除示例

    public class DeleteElasticAPI { private static RestClient restClient; static { restClient=RestClient ...

  9. SpringBoot自定义过滤器的两种方式及过滤器执行顺序

    第一种 @WebFilter + @ServletComponentScan 注解 1.首先自定义过滤器 如下自定义过滤器 ReqResFilter 必须实现  javax.servlet.Filte ...

  10. 利用HBuilder打包Vue开发的webapp为app

    众所周知,前端开发完成的webapp只能运行在浏览器上,对运行环境有一定的限制,也就是除了浏览器其他的环境下不支持:那么现在如果有个需求是这样的呢?需要一套代码三端运行呢?三端运行(黑人脸??)是的, ...