Программа C для поиска конечных НОЛЬ в конце FACTORIAL заданного числа

Я вернул код, чтобы найти факториал и отобразить конечные нули в конце факториала, но вывод неправильный... не могли бы вы помочь мне найти ошибку?

#include <stdio.h>

int main() {
    int m = 1, i, N, count = 0;

    scanf("%d", &N);

    for (i = 1; i <= N; i++) {
        m = m * i;
    }
    printf("%d", m);

    while (m > 0) {
        if ((m % 10) == 0) {
            count = count + 1;
            m = m / 10;
        }
        break;
    }
    printf("%d", count);

    return 0;
}

person pop    schedule 07.05.2019    source источник
comment
Это не тот подход, который предполагает задача. Наивный здесь не сработает, нужно думать о нетривиальном алгоритме. Что касается вашей проблемы - вы, скорее всего, просто переполняете целое число.   -  person Eugene Sh.    schedule 07.05.2019
comment
Было бы здорово, если бы вы также могли рассказать нам, какие входные данные вы пробовали и какие результаты вы получили. Ошибка могла быть вызвана многими причинами. Редактировать: Конечно, есть более простые способы сделать это как @EugeneSh. заявил. Думайте об этом как об умножении. Что заставляет ваш результат иметь 0 в конце?   -  person Yiğit Aras Tunalı    schedule 07.05.2019
comment
Вы должны подумать о другой логике, так как я думаю, что подход неправильный.   -  person Mr. Suklav Ghosh    schedule 07.05.2019
comment
Чтобы сделать это без переполнения, вы просто считаете каждый раз, когда умножаете на 5, например, в 25! вы умножаете на 5 дважды для 25, по одному разу для 15, 10 и 5. Таким образом, будет 5 конечных нулей (обратите внимание, что есть избыток кратных 2, чтобы превратить 5 в кратные 10)   -  person James Snook    schedule 07.05.2019
comment
@JamesSnook Я не уверен, что этого достаточно, так как кажется, что могут быть другие комбинации чисел или суммы комбинаций, которые могут генерировать дополнительные конечные нули, особенно для больших чисел.   -  person Andrew Henle    schedule 07.05.2019
comment
@AndrewHenle Вы можете только получить число, кратное десяти, выполнив 5 * 2, а число, кратное 10, — единственный способ получить конечные нули.   -  person James Snook    schedule 07.05.2019


Ответы (3)


у тебя две проблемы

  • вы сворачиваете два выхода, чтобы вы видели только один из них / вы не можете видеть, кто есть кто, просто добавьте разделитель между ними
  • else отсутствует, когда вы считаете, поэтому вы считаете только до 1, и результат неверен из факториала 10

Таким образом, минимальные изменения производят:

int main()
{
    int m=1,i,N,count=0;

    scanf("%d",&N);

    for(i=1;i<=N;i++)
    {
        m=m*i;
    }
    printf("%d\n",m); /* <<< added \n */

    while(m>0)
    {
      if((m%10)==0)
      {
        count=count+1;
        m=m/10;
      }
      else /* <<< added else */
        break;
    }
    printf("%d\n",count); /* <<< added \n */

    return 0;
}

после изменений:

pi@raspberrypi:/tmp $ ./a.out
5
120
1
pi@raspberrypi:/tmp $ ./a.out
10
3628800
2

Конечно, это предполагает, что сначала вы можете вычислить факториал без переполнения.

Я также рекомендую вам проверить, было ли значение прочитано scanf, проверка возвращает 1

person bruno    schedule 07.05.2019

Ваш код работает только для очень малых значений N: до 9. Для немного больших значений вам нужно будет добавить ключевое слово else перед оператором break, и вы получите правильный результат еще в нескольких случаях.

Для больших значений необходимо вычислить степень числа 5, которая делит факториал. Вы можете сделать это постепенно, суммируя степени 5, которые делят каждое отдельное число до N включительно.

#include <stdio.h>

int main() {
    int N, count;

    if (scanf("%d", &N) != 1)
        return 1;

    /* only consider factors that are multiples of 5 */
    count = 0;
    for (int i = 5; i <= N; i += 5) {
        for (int j = i; j % 5 == 0; j /= 5)
             count++;
    }
    printf("%d\n", count);
    return 0;
}

Еще более простое и быстрое решение: вычислить количество кратных 5 меньше или равно N, добавить количество кратных 5*5 и т. д.

Вот код:

#include <stdio.h>

int main() {
    int N, count;

    if (scanf("%d", &N) != 1)
        return 1;

    count = 0;
    for (int i = N; (i /= 5) > 0;) {
        count += i;
    }
    printf("%d\n", count);
    return 0;
}
person chqrlie    schedule 07.05.2019

person    schedule
comment
Я предлагаю вам добавить подробности о том, в чем была проблема, прежде чем давать ответ. Таким образом, люди могут учиться, а не просто находить решения. - person mw509; 11.03.2020