如何使这段代码更短,更有效?

时间:2020-04-21 07:52:43

标签: c cs50 credit-card luhn

这是我针对CS50的Pset1上的信用问题的解决方案。它涉及使用Luhn算法来测试输入的信用卡号的有效性,并基于一些条件尝试识别信用卡公司。

Check_Length尝试查找输入数字的长度。 Check_Company尝试标识该公司。 Check_Luhn根据Luhn算法验证数字。

我想知道是否可以用更少的代码行来完成。

#include <stdio.h>
#include <cs50.h>
#include <stdbool.h>

int check_length(long);
void check_company(int,long);
bool check_luhn(long,int);
int length;

int main(void)
{
        long c = get_long("Enter Credit Card Number: ");
        check_length(c);
        check_luhn(c,length);
        if(check_luhn(c,length)==true)
        {
                check_company(length,c);
        }
        else printf("INVALID\n");

}

int check_length(long w)
{
        for(int i=12;i<16;i++)
        {
                long power = 1;
                for (int k=1;k<i+1;k++)
                {
                        power = power * 10;
                }
                int scale = w/power;
                if (scale<10 && scale>0)
                {
                        length = i+1;
                }              
       }    
       return length;
}

void check_company(int x,long z)
{
        if(x == 15)
        {
                int y = z/10000000000000;           //z/10^13
                if(y==34||y==37)
                {
                        printf("AMEX\n");
                }
                else
                {
                printf("INVALID\n");
                }
        }
        else if(x==13)
        {
                int y = z/100000000000;                 //z/10^11
                if(y==4)
                {
                       printf("VISA\n");
                }
         }
         else if(x==16)
         {
                 int q = z/1000000000000000;
                 int y = z/100000000000000;
                 if(y==51||y==52||y==53||y==54||y==55)
                 {
                         printf("MASTERCARD\n");
                 }
                 else             
                 if(q==4)
                 {
                         printf("VISA\n");
                 }
                 else printf("INVALID\n");
         }
         else printf("INVALID\n");
}

bool check_luhn(long a,int b)
{
         int f = 0;
         int j=0;
         for(int d=1;d<b+1;d++)
         {    
                 int e = a%10;
                 a = a/10;
                 if(d%2==1)
                 {
                        f = f+e;
                 }
                 else
                 {
                         int m = 2*e;
                         int g = m%10;
                         int h = m/10;
                         j = j+g+h;
                  }

          }
          int l = j + f;
          if(l%10==0)
          {
                 return true;
          }
          else return false;
}

0 个答案:

没有答案