[解题报告]11743 - Credit Check
题目大意
题目原文:http://uva.onlinejudge.org/external/117/11743.pdf
背景:
今日,用信用卡网络购物已经变得相当普遍,由于用户可能打错信用卡号,所以一般电子商务型网站都会对信用卡号作检查。
其中一种错误检查机制称为Luhn algorithm,它可以把所有打错一个位数的错误找出来,甚至于能挑出打错多个位数的错误,它的检查规则如下:
用一个例子来讲解会比较方便,例如信用卡号(5181 2710 9900 0012):
1. 将偶数字置上的数字乘2,也就是将 ( 5181 2710 9900 0012 )中粗体底线的数字乘2,得到10, 16, 4, 2, 18, 0, 0, 2。
2. 将刚刚所得到的数字中每一个位数数值加总,即(1+0) + (1+6) + 4 + 2 + (1+8) + 0 + 0 + 2 =25。将信用卡号中奇数字数的数字作加总,即1+1+7+0+9+0+0+2 = 20,再将两数相加25+20=45。
3. 45的个位数并非0,所以这个信用卡号并不合法。
本题请你用此法检查信用卡号是否正确
输入
输入的第一列为整数N,表示测试数据的组数,接下来的N列分别为一个信用卡号,信用卡号有16个数目字,四个数字一组以一个空格符隔开。
输出
若信用卡号是检查合格的,请输出"Valid",否则请输出"Invalid"。
Sample Input
2 5181 2710 9900 0012 5181 2710 9900 0017
Sample Output
Invalid Valid
算法:
好吧,我会吐糟这道题我整整花了三个小时去解决吗,好啃爹的题目啊,一直出错。一开始用gets接收那些所有字符串,后面n的值不懂怎么变了,然后就一直找,找问题就是找不到,后面改用scanf来输入字符,然后又出现问题了,就不能循环了,到后面才知道原来是没有重新赋值,好吧最后还是AC了。我很想知道的是为什么scanf输入后n的值会发生改变。求大神解释。
代码:
这里附上我的代码,你可以去这里提交你的代码验证你的代码是否正确。
#include<stdio.h> int main(void) { char s[4][5]; int a[8]; int n,i,j,k,b,c,sum1,sum2,l; scanf("%d",&n); for(i=0;i<8;i++) a[i]=0; while(n--) { sum1=sum2=0; j=1;k=0;b=0;c=0; for(i=0;i<4;i++) scanf("%s",s[i]); for(i=0;i<4;i++) { for(l=0;l<4;l++) { j++; if(j%2==0) { a[k]=(s[i][l]-'0')*2; k++; } else sum1+=s[i][l]-'0'; } } for(i=0;i<8;i++) { if(a[i]<10) sum2+=a[i]; else { b=a[i]%10; sum2+=b; c=a[i]/10; sum2+=c; } } if((sum1+sum2)%10!=0) printf("Invalid\n"); else printf("Valid\n"); } return 0; }