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