делая мое решение CS50 более элегантным и эффективным - PullRequest
0 голосов
/ 24 апреля 2020

Я беру CS50, и я выполнил первую неделю задачи по реализации алгоритма Luhn Check. Хотя мое решение работает, я чувствую, что оно очень неаккуратное и неэффективное. Может кто-нибудь предложить, пожалуйста, как я могу улучшить свое решение. (Это проблема первой недели; вы не собираетесь использовать массивы или функции.)

Вот код:

#include<stdio.h>
#include<stdlib.h>
#include<cs50.h>
int main()
{
    long long x,j=0;
    int len,i,len_flag,flag=0,flag_val=0,sp_len=0,check_flag=0; //basic integers related  to loop etc
    int res,sum,fin_sum=0,h=0,d2_sum=0,d1_sum=0,ff_num=0; // variables  related to extracting numbers 
    int sum_len=0,in_sum=0,in_fsum=0,len_sum=0,m=0; // extraing numbers from more than single  sum result 
    int sum_f=0,sum_final=0;


    do{
        x = get_long("enter a valid card number \n");
        j=x;
        len_flag = 0;
        len = 0;
        while(len_flag!=1)
        {
          x = x / 10;
          if(x==0)
          {
            len_flag = 1;   //finding the lenght of the number 
          }
          len++;
        }
        if(len==15||len==16||len==13)
        {
          flag = 1;
          sp_len =1;
        }
        else
        {
            flag=1;
        }

    }while(flag!=1);


    for(i=0;i<len;i++)
    {
       res = j % 10;
       j = j / 10;
       if(i%2!=0)
       {

        sum = res * 2;
        //printf("multi_res : %d \n",sum);
        len_flag = 0;
        sum_len = 0;
        len_sum = sum;
        while(len_flag!=1)
        {
            len_sum = len_sum / 10;
            if(len_sum==0)
            {
               len_flag=1;       // checking if the sum is more than single  digit 
            }   
            sum_len++;
            //printf("trig\n");
        }
        if(sum_len>1)
        {   x=0;
            while(x<sum_len)
            {
             in_sum = sum % 10;
             sum = sum/10; 
             in_fsum = in_fsum + in_sum; 
             //printf("double sum : %d \n",in_fsum);
             x++;

            }
        }

        fin_sum = fin_sum + sum;

       }
       if(i==len-1)
       {

         for(h=0;h < 1;h++)
         {
            fin_sum = fin_sum + in_fsum; 
         }

         d1_sum = res;
       }

       else if(i%2==0)
       {
        sum_f = sum_f + res; // adding up the number that where not  x2
       }

       if(i==len-2)
       {
         d2_sum = res;     //5555555555554444
       }

    }

    sum_final = sum_f + fin_sum;

    //printf("sum_final : %d\n",sum_final);
    //printf("sum_f_final : %d\n",sum_f);
    //printf("sum_in_final : %d\n",fin_sum);

    if(sum_final%10==0)
    {
        flag_val=1; // checking if the number is valid  
    }
    if(ff_num == 0)
    {                                   
        ff_num = (d1_sum*10) + d2_sum;     //flip
    }

    do
    {
       if(sp_len==0)
       {
        printf("INVALID\n");
        check_flag=1;
        break;
       }
       if((flag==1&&flag_val==1&&ff_num==34)||ff_num==37)
       {
        printf("AMEX\n");
        check_flag=1;
        break;
       }
       else if(flag==1&&flag_val==1&&ff_num>50&&ff_num<56)
       {
        printf("MASTERCARD\n");
        check_flag=1;
        break;
       }
       else if(flag==1&&flag_val==1&&d1_sum==4)
       {
        printf("VISA\n");
        check_flag=1;
        break;
       }
       else
       {
        printf("INVALID\n");
        check_flag=1;
        break;
       }
    }while(check_flag!=1);

    return 0;

}

Я чувствовал, что исправлял утечку при написании кода , Я попытался бы исправить одну вещь, а другая вещь была бы go неправильной, и это конечный результат.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...