result[d]=list[d];
}
returnresult;
}
}
结果截图与分析:
该结果满足实验要求
5.(附加题5.31信用卡号的合法性,可选做)信用卡号遵循下面的模式。
一个信用卡号必须是13-16位的整数。
它的开头必须是:
4,指visa卡
5,指master卡
37,指AmericanExpress卡
6,指Discovery卡
在1954年,IBM的HansLuhn提出一种算法,该算法可以验证信用卡号的有效性。
这个算法在确定输入的卡号是否正确,或者这张信用卡是否能被正确扫描是非常有用的。
该方法通常被称为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型整数的信用卡号码,显示这个数字是合法还是非法的。
使用下面的方法设计程序:
/*Returntrueifthecardnumberisvalid*/
publicstaticbooleanisValid(longnumber)
/*Gettheresultfromstep2*/
publicstaticintsumOfDoubleEvenPlace(longnumber)
/*Returnthisnumberifitisasingledigit,otherwisereturnthesumofthetwodigits*/
publicstaticintgetDigit(intnumber)
/*Returnsumofoddplacedigitsinnumber*/
publicstaticintsumOfOddPlace(longnumber)
/*Returntrueifthedigitdisaprefixfornumber*/
publicstaticbooleanprefixMatched(longnumber,intd)
/*Returnthenumberofdigitsind*/
publicstaticintgetSize(longd)
/*Returnthefirstknumberofdigitsfromnumber.Ifthenumberofdigitsinnumberislessthank,returnnumber*/
publicstaticlonggetPrefix(longnumber,intk)
代码实现:
packagejava_shiyan;
importjava.util.Scanner;
publicclassJudgeID_5_31{
publicstaticvoidmain(String[]args){
//TODOAuto-generatedmethodstub
System.out.print("PleaseentertheID:
");
Scannerinput=newScanner(System.in);
longnumber=input.nextLong();
if(isValid(number)){
System.out.print("TheIDcardisLEGALE");
}
else{
System.out.print("TheIDcardisNOTLEGALE");
}
}
publicstaticbooleanisValid(longnumber){
booleancharge=true;
if(getSize(number)<13||getSize(number)>16){
charge=false;
}
if((sumOfDoubleEvenPlace(number)+sumOfOddPlace(number))%10!
=0){
charge=false;
}
if(!
prefixMatched(number)){
charge=false;
}
returncharge;
}
publicstaticintsumOfDoubleEvenPlace(longnumber){
longsum=0;
if(getSize(number)%2==0){
for(intr=2;r<=getSize(number);r=r+2){
if(getPrefix(number,r)<5&&getPrefix(number,r)>=0){
sum=sum+getPrefix(number,r)*2;
}
else{
sum=sum+getPrefix(number,r)*2-9;
}
}
}
else{
for(intr=2;r<=getSize(number);r=r+2){
sum=sum+getPrefix(number,r);
}
}
intn=(int)sum;
//System.out.print(n+"");
returnn;
}
publicstaticintsumOfOddPlace(longnumber){
longsum=0;
if(getSize(number)%2==0){
for(intr=1;rsum=sum+getPrefix(number,r);
}
}
else{
for(intr=1;rsum=sum+getPrefix(number,r);
}
}
intn=(int)sum;
//System.out.print(n+"");
returnn;
}
publicstaticlonggetPrefix(longnumber,intk){
doublet=(number%(Math.pow(10,k))-number%(Math.pow(10,k-1)))/(Math.pow(10,k-1));
longm=(long)t;
//System.out.print(m);
returnm;
}
publicstaticintgetSize(longd){
longs=1;
intcount=0;
while(d/s!
=0){
s=10*s;
count++;
}
//System.out.print(d/s);
returncount;
}
publicstaticbooleanprefixMatched(longnumber){
booleanch=false;
longa=getPrefix(number,getSize(number));
longb=getPrefix(number,getSize(number)-1);
if(a==4||a==5||a==6){
ch=true;
}
if(a==3&&b==7){
ch=true;
}
returnch;
}
}
结果截图与分析:
该结果满足实验要求