T
T
timur1022019-01-14 18:38:39
C++ / C#
timur102, 2019-01-14 18:38:39

How to improve code in terms of readability?

Solved this problem in C.

the code
/*
 * Maximize a-b
 */

#include <stdio.h>
#include <stdlib.h>

int maximize(int number);  /* 9876543210 */
int minimize(int number);  /* 1023456789 */
int get_count_of_digits(int num);
int cmp(const void *a, const void *b);
void itoa(int number, int length, int arr[]);
int atoi_(int s[], int length);
void reverse(int s[], int length);



int main()
{
  int a,b;
  int result_a, result_b;

  scanf("%d\n%d", &a, &b);

  result_a = (a<0) ? minimize(a) : maximize(a);
  result_b = (b<0) ? maximize(b) : minimize(b); 

  printf("%d\n", result_a - result_b);

  return 0;
}

int minimize(int number){
  int sign,zeros = 0, flag = 0, j = 0;
  int length = get_count_of_digits(number);
  int string[length], result[length], res;
  if ((sign = number) < 0)
    number = -number;
  if (number == 0)
    return 0;
  itoa(number, length, string);

  qsort(string, length, sizeof(int),  cmp);

  for (int i = 0; i < length; i++){
    if (string[i] != 0){
      flag = 1;
      result[j++] = string[i];
    }
    if (string[i] == 0 && flag == 0)
      zeros++;
    else if (flag == 1 && zeros){
      while (zeros-- > 0)
        result[j++] = 0;
    }
  }

  res = atoi_(result, length);
  if (sign < 0)
    res = -res;
  return res;
}


int maximize(int number){
  int sign,zeros = 0, flag = 0, j = 0;
  int length = get_count_of_digits(number);
  int string[length], result;
  if ((sign = number) < 0)
    number = -number;
  if (number == 0)
    return 0;
  itoa(number, length, string);

  qsort(string, length, sizeof(int),  cmp);
  reverse(string, length);
  result = atoi_(string, length);

  if (sign < 0)
    result = -result;

  return result;
}


int cmp(const void *a, const void *b) {
    return *(int*)a - *(int*)b;
}



int get_count_of_digits(int num){
  int count = (num == 0) ? 1 : 0;
  while (num){
    count++;
    num /= 10;
  }

  return count;
}

void itoa(int n, int length, int arr[]){
  int i = 0;	

  do {
    arr[i++] = n % 10;
  } while ((n/=10) > 0);

  arr[i] = '\0';
  reverse(arr, length);
}

 void reverse(int s[], int length)
 {
     int i, j;
     int c;
 
     for (i = 0, j = length-1; i<j; i++, j--) {
         c = s[i];
         s[i] = s[j];
         s[j] = c;
     }
 }



int atoi_(int s[], int length){
  int n = 0;
  for (int i = 0; i<length;i++){
    n *= 10;
    n += s[i];
  }	
  return n;

}


But it turned out 133 lines of code. I think that's a lot. How can readability be improved?

Answer the question

In order to leave comments, you need to log in

2 answer(s)
J
jcmvbkbc, 2019-01-14
@timur102

Why so many different things?
Why convert numbers into integer arrays of digits, why not operate with strings? Why invent your own itoa and atoi? Why sort and then do reverse, why not just change the sort condition?
Why not do this:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

static int cmp_min(const void *a, const void *b)
{
    int va = *(const char *)a;
    int vb = *(const char *)b;
    return va - vb;
}

static int minimize(int v)
{
    char str[sizeof(int) * 3 + 1];
    int i;

    sprintf(str, "%d", v);
    qsort(str, strlen(str), 1, cmp_min);
    if (str[0] == '0') {
        for (i = 0; str[i]; ++i) {
            if (str[i] != '0') {
                str[0] = str[i];
                str[i] = '0';
                break;
            }
        }
    }
    sscanf(str, "%i", &v);
    return v;
}

static int cmp_max(const void *a, const void *b)
{
    int va = *(const char *)a;
    int vb = *(const char *)b;
    return vb - va;
}

static int maximize(int v)
{
    char str[sizeof(int) * 3 + 1];

    sprintf(str, "%d", v);
    qsort(str, strlen(str), 1, cmp_max);
    sscanf(str, "%i", &v);
    return v;
}

int main()
{
    int a, b;
    int result_a, result_b;

    scanf("%i %i", &a, &b);
    result_a = a < 0 ? -minimize(-a) : maximize(a);
    result_b = b < 0 ? -maximize(-b) : minimize(b);
    printf("%d\n", result_a - result_b);
    return 0;
}

P
pfemidi, 2019-01-14
@pfemidi

int length = get_count_of_digits(number);
int string[length], result;

This freak won't work.
After all, they have already said that such arrays must be created dynamically .
I didn't even look at this mess.

Didn't find what you were looking for?

Ask your question

Ask a Question

731 491 924 answers to any question