课内实验记录

您所在的位置:网站首页 办信用卡输入5个字符 课内实验记录

课内实验记录

2024-03-25 08:55| 来源: 网络整理| 查看: 265

题目要求

(附加题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 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("这个卡号是无效的"); } } }


【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3