一切看起来都很好,似乎遵循 Luhn 的算法,但是当我输入我自己的信用卡号或这个应该有效的样本号: 4388576018410707 时,它仍然返回无效......
任何人都可以找到问题吗?
#include <stdio.h>
int isvalid(long num);
int sumofdoubleevenplace(long num);
int getdigit(int num);
int sumofoddplace(long num);
int prefixmatched(long num,int d);
int getsize(long d);
int getprefix(long num,int k);
main(){
long cardnum=0;
printf("Enter credit card number ");
scanf("%ld",&cardnum);
if(isvalid(cardnum)==1)
printf("Valid card number\n");
else
printf("Invalid card number\n ");
return 0;
}
int isvalid(long num){
if(((sumofoddplace(num)+sumofdoubleevenplace(num))%10==0)
&& (getsize(num)<=16 && getsize(num)>=13)
&& (prefixmatched(num,4)==1 || prefixmatched(num,5)==1 ||
prefixmatched(num,6)==1 || prefixmatched(num,37==1)))
return 1;
else
return 0;
}
int sumofdoubleevenplace(long num){
int numdigits=getsize(num)-1;
int sum=0,i;
num/=10;
for(i=0;i<numdigits;i+=2){
sum+=getdigit((int)(2*(num % 10)));
num/=100;
}
return sum;
}
int getdigit(int num){
return ((num-num%10)/10)+num%10;
}
int sumofoddplace(long num){
int numberofdigits=getsize(num);
int sum=0,i;
for(i=0;i<numberofdigits;i+=2){
sum+=num%10;
num/=100;
}
return sum;
}
int prefixmatched(long num,int d){
if(getprefix(num,getsize(d))==d)
return 1;
else
return 0;
}
int getsize(long d){
int n=0;
while(d!=0){
d/=10;
n++;
}
return n;
}
int getprefix(long num,int k){
int numberofdigits=getsize(num);
int i;
if(numberofdigits-k>0){
for(i=0;i<numberofdigits-k;i++){
num/=10;
}
return num;
}
else
return num;
}