Как сделать этот код короче и эффективнее? - PullRequest
0 голосов
/ 21 апреля 2020

Это моё решение проблемы с кредитом на CS50 Pset1. Он включает в себя использование алгоритма Луна для проверки действительности введенного номера кредитной карты и на основании нескольких условий пытается определить компанию-эмитента кредитной карты.

Check_Length пытается найти длину введенного номера. Check_Company пытается идентифицировать компанию. Check_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;
}
...