Answer the question
In order to leave comments, you need to log in
How to improve code in terms of readability?
Solved this problem in C.
/*
* 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;
}
Answer the question
In order to leave comments, you need to log in
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;
}
Didn't find what you were looking for?
Ask your questionAsk a Question
731 491 924 answers to any question