首先,分享一个网站:https://cs50.readthedocs.io/#c
接下来:上代码——
- Q:输入卡号,判断卡的归属或不合法.
INVALID :非法卡号
AMEX:34、37开头 15位(eg:378282246310005)
MASTERCARD:51~55开头 16位
VISA :4开头 13 or 16位(eg:4003600000000014)
卡号合法性判断:
1.从倒数第2位往前,每间隔的数字乘2, 并且把所有数字相加
2.将相加的结果加上卡号中未乘以2的数字
3.如果第2步的结果,以0结尾,则是合法卡号。
解题代码①
# include <cs50.h>//注意cs是小写的(鄙人易错之处)
# include<stdio.h>
int main ()
{
long int i, m, c, d, e, f, p;
scanf("%ld", &m);
long int b = m, s = 0, a = 1;
while(a!=0)
{
a = b/100;
k = b/10;
b = a%10;
l = k%10;
s += 2*b;
s += l;
}
//判断AMEXDE条件
c = m - 3.4e14;//printf("%.0f\n",c/(1e13));
d = m - 3.7e14;//printf("%.0f\n",d/(1e13));
//判断Visa条件
e = m - 4e13;//printf("%.0f\n",e/(1e12));
f = m - 4e15;//printf("%.0f\n",d/(1e15));
//判断MasterCredit条件
for (i = 51; i < 56; i++)
{
if((m-i*(1e13))/ (i*(1e13))==0)
{
p = 1;
break;
}
else p = 0;
}
// printf("%ld\n", p);
if(s%10 != 0)
printf("您输入的为非法卡号");
else if((c/(1e13) <= 1&&c/(1e13) >= -1)||(d/(1e13) <= 1&&d/(1e13) >= -1))
printf("此卡为AMEX");
else if((e/(1e12) - 0 <= 1&&e/(1e12) - 0 >= -1)||(f/(1e15) -0 <= 1&&f/(1e15) -0 >= -1))
printf("此卡为Visa");
else if(p == 1)
printf("此卡为MasterCard");
else
printf("此其他类型卡");
return 0;
}
解题代码②
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
#include<cs50.h>
#define N 20
bool Luhn(string s);
int getLenth(string s);
void toArray(string s ,int arr[N]);
bool inSafe(int arr[N] ,int n);
//主函数
int main(void)
{
int n ,i ,IDcode[N];
string ID;
ID = get_string("Numbers:");//get card ID//字符串(String)是由零个或多个字符组成的有限序列。所以可以是数字、特殊符号、空的。”
n = getLenth(ID);//get ID size
toArray(ID,IDcode);//convert ID int IDcode(array)
while(inSafe(IDcode,n) == false)
{
ID = get_string("Retry:");//get card ID
n = getLenth(ID);//get ID size
toArray(ID,IDcode);//convert ID int IDcode(array)
}//Retry if input unsafe
// printf("IDstr:%s\n",ID);
// printf("convert result:%lu\n",strtol(ID, NULL, 10));
// printf("IsLuhn?:%d\n",Luhn(ID));
// printf("IDcode:");
// for(i=0;i<N;i++)
// printf("%d ",IDcode[i]);
// printf("sizeofIDcode:%d\n",n);
// printf("\n");
if(Luhn(ID) == 1)/*condition of valid card*/
{
if(n==15 && (IDcode[n-1]==3 && (IDcode[n-2]==4 || IDcode[n-2]==7))/*condition of AmericanExpress*/)
printf("AMEX\n");
else if(n==16 && (IDcode[n-1]==5 && (IDcode[n-2]>=1 && IDcode[n-2]<=5))/*condition of MasterCard*/)
printf("MASTERCARD\n");
else if((n==13 || n==16) && IDcode[n-1]==4/*condition of Visa*/)
printf("VISA\n");
else
printf("UNKNOW\n");
}
else
printf("INVALID\n");
// recognize the type of card
return 0;
}
//判断是否为合法卡号
bool Luhn(string s)//此s为ID
{
int oddSum=0, evenSum=0;//odd奇数even偶数
int i;
for(i=strlen(s)-1; i>=0; i-=2)
oddSum+=(s[i]-48);//48是0的ACII码//当字符与数字做运算(逻辑或算术)时,字符自动转化为ASII码
for(i=strlen(s)-2; i>=0; i-=2)
{
int wenum=2*(s[i]-48);
if(wenum>=10)
evenSum+=(wenum-9);
else
evenSum+=wenum;
}
if((evenSum+oddSum)%10==0)
return 1;
else
return 0;
}//luhn for string
int getLenth(string s)//得到s的字长
{
int n;
n = strlen(s);
return n;
}
//字符串数组与整型数组转换
void toArray(string s, int arr[N])
{
for(int i=0 ; i<N ; i++)
arr[i] = s[i]-48;
}
//是否有非法字符(非数字)的输入
bool inSafe(int arr[N] ,int n)
{
for(int i=0 ; i<n ; i++)
{
if(arr[i]<0 || arr[i]>9)
return false;
}
return true;
}
以上代码不要在visual和Dev上运行,绝大多数也运行不了。就在CS50 IDE上编译运行