Переставьте число по возрастанию цифр

#c

Вопрос:

Мне нужно решить проблему, в которой одной из важных задач является изменение порядка цифр ввода в порядке возрастания, и нам не разрешается использовать массивы и списки. У меня нет проблем с этим, и мой код работает, но только в том случае, если мы не рассматриваем значение 0, которое мы должны в этой проблеме. Единственный способ, который я вижу, как это сделать, — проверить цифру за цифрой, а затем добавить, затем упорядочить, умножив число на 10 и добавив следующую цифру. (1*10 = 10, 10 3= 13, мы заказали 1 и 3) Однако, если в нашем номере будет 0, этот метод не будет работать, потому что, если я захочу сделать 0123 с помощью метода * 10, я никогда не смогу использовать 0 в качестве первой цифры. Кто-нибудь знает, как это решить? Мой код приведен ниже:

 int ascendingNumbers (int n) {   //This function sorts the number on an ascending order
    int number = n;
    int sortedN = 0;
    for (int i = 0; i <= 9; i  ) {
        int toSortNumber = number;
        for (int x = 0; x <= 4; x  ) {
            int digit = toSortNumber % 10;
            if (digit == i) {
                if (digit == 0) {
                    sortedN==10;
                }
                sortedN *= 10;
                sortedN  = digit;
            }
            toSortNumber /= 10;
        }
    }
    return sortedN;
}
 

Комментарии:

1. Я не понимаю, как вы можете считать начальный ноль, когда работаете с числовыми типами ( int ). Начальный ноль будет существовать только в том случае, если вы представляете число в виде строки, которая является массивом, который вам запрещено использовать.

2. С учетом ограничений, о которых вы упомянули , возвращая an int , невозможно иметь начальные нули. Вы абсолютно уверены, что это часть данной проблемы?

3. sortedN==10; — Ты не sortedN=10; это имеешь в виду ?

4. Если вам нужны начальные цифры, либо подсчитайте цифры и верните количество, чтобы при печати можно было использовать ширину поля и 0 префикс printf ; Либо считайте число в виде строки.

5. Это, вероятно, не очень полезный комментарий, но: если бы кто-то сказал мне привести что-то в порядок, не используя массивы или списки, я бы спросил их, что они курили, и посоветовал им отправиться в поход. Серьезно. В этом упражнении нет никакого смысла. Это не научит вас ничему, что вы когда-либо будете использовать. Поставьте 0 на это задание и вместо этого идите смотреть на цветы и деревья или что-то в этом роде. Твоя душа поблагодарит тебя.

Ответ №1:

Обычно я не делаю домашних заданий, но для особенно ужасных я сделаю исключение. (Также я делаю исключение из своего общего правила, чтобы не иметь ничего общего с этими абсурдными ограничениями «необитаемого острова», когда вы оказались в затруднительном положении после кораблекрушения, а функциональность массива вашего компилятора C была повреждена во время шторма или что-то в этом роде.)

Я предполагаю, что вам разрешено вызывать функции. В таком случае:

 #include <stdio.h>

/* count the number of digits 'd' in 'n'. */
int countdigits(int n, int d)
{
    int ret = 0;
    /* do/while so consider "0" as "0", not nothing */
    do {
        if(n % 10 == d) ret  ;
        n /= 10;
    } while(n > 0);
    return ret;
}

int main()
{
    int i, n;
    printf("enter your number:n");
    scanf("%d", amp;n);

    printf("digits: ");
    for(i = 0; i < 10; i  ) {
        int n2 = countdigits(n, i);
        int j;
        for(j = 0; j < n2; j  ) putchar('0'   i);
    }
    printf("n");
}
 

Это решение не включает в себя функцию int ascendingNumbers() , о которой вы спрашивали. Если вы хотите обрабатывать начальные нули, как описано в комментариях, вы не можете сделать это с помощью функции, которая возвращает an int .

Комментарии:

1. Один на открытие …

2. Если бы я был профессором, моим самым большим страхом был бы Стив Саммит, комментирующий одно из моих домашних заданий со строкой «Обычно я не делаю домашних заданий, но, о боже, я сделаю исключение…». Кстати, я думаю, что задание ОП было плохо объяснено (ОП), возможно, есть какая-то недостающая информация, которая сделала бы это нормальным заданием.