[解题报告]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;
}

 

posted @ 2013-02-22 12:42  乱七八糟 。  阅读(443)  评论(0编辑  收藏  举报