Найти наибольшее интересное число, меньшее заданного целого числа

#c #loops

#c #циклы

Вопрос:

Одно число интересно, если его перевернутое число делится на количество цифр, которое оно содержит. Таким образом, программа должна считывать из SI значение n(n> 9). Найдите и выведите наибольшее интересное число, меньшее, чем n. Если введенное число недопустимо, оно должно вывести «Недопустимый ввод». Итак, это код, который я написал, но я не могу заставить его работать. Я любезно прошу некоторой помощи. Заранее спасибо

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

int main()
{
    int n, flippedNumber=0, remainder;
    int count = 0, i;
    scanf ("%d", amp;n);
    int largestInteresting = n;
    while ( n != 0)
    {
        n /= 10;
          count;
    }
    while (n > 9)
    {
        for (i = 0; i < n; i  )
        {
            remainder = n%10;                       
            flippedNumber = flippedNumber*10   remainder;
            n /= 10;
        }
        --largestInteresting;
    }
    if ((flippedNumber % count) == 0 amp;amp; largestInteresting > i)
        printf ("%d", largestInteresting);
    else
        printf ("Invalid input");
    return 0;
}
  

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

1. Что это делает? Во-первых, ваш первый цикл while выполняется до n == 0 , а ваш второй никогда не будет выполняться, потому что n никогда не может быть больше 9 .

2. при запуске опубликованного кода пользователь остается с мигающим курсором и без указания того, что пользователь должен делать дальше. Предложите выводить приглашение каждый раз, когда ожидается, что пользователь что-либо введет. Это приглашение должно сообщить пользователю диапазон и тип ввода для ввода.

3. в конце первого while() цикла ‘n’ будет равно 0. Тогда второй while() цикл никогда не будет введен.

4. для удобства чтения и понимания: 1) имена переменных должны указывать на использование или содержимое (или, лучше, на оба варианта). 2) следуйте аксиоме: только один оператор в строке и (максимум) одно объявление переменной в операторе. 3) разделите блоки кода (для, if, else, while, do…while, switch, case, default) с помощью пустой строки.

5. при вызове любой из scanf() семейства функций всегда проверяйте возвращаемое значение (не значения параметров), чтобы убедиться, что операция прошла успешно.

Ответ №1:

Проблемы с вашим кодом: вы фактически уничтожаете n подсчет цифр, но затем пытаетесь повторно использовать его для чего-то другого, не обновляя его значение (форма largestInteresting?); вы не выполняете проверку интересного числа в цикле, который отсчитывает входное число, поэтому вы никогда не найдете то, что ищете; вы ждете завершения циклов, прежде чем выполнять тест интересного числа, но вам не нужно завершать циклы, как только вы найдете первое интересное число, если вы ведете обратный отсчет.

Моя доработка ниже включает в себя мое искаженное объяснение выше, а также некоторые изменения стиля:

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

int main()
{
    int number;

    (void) scanf ("%d", amp;number);

    if (number < 10)
    {
        fprintf(stderr, "Invalid inputn");
        return EXIT_FAILURE;
    }

    for (int n = number; n > 9; n--)
    {
        int digitCount = 0;
        int temporary = n;

        while (temporary != 0)
        {
            temporary /= 10;
              digitCount;
        }

        int flippedNumber = 0;
        temporary = n;

        for (int i = 0; i < digitCount; i  )
        {
            int remainder = temporary % 10;
            flippedNumber = flippedNumber * 10   remainder;
            temporary /= 10;
        }

        if ((flippedNumber % digitCount) == 0)
        {
            printf("%dn", n);
            return EXIT_SUCCESS;
        }
    }

    fprintf(stderr, "No interesting numbers found!n");     
    return EXIT_FAILURE;
}
  

ПРИМЕР ИСПОЛЬЗОВАНИЯ

 > echo 10 | ./a.out
No interesting numbers found!
> echo 100 | ./a.out
89
> echo 1000 | ./a.out
999
> echo 10000 | ./a.out
8899
> echo 100000 | ./a.out
59999
> echo 1000000 | ./a.out
899997
>