Программа на C, чтобы найти конечные нули в конце FACTORIAL данного числа - PullRequest
1 голос
/ 07 мая 2019

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

#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;
}

Ответы [ 2 ]

6 голосов
/ 07 мая 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;
}
1 голос
/ 07 мая 2019

у вас две проблемы

  • вы свернули два выхода, поэтому вы видите только один из них / вы не можете видеть, кто есть кто, просто добавьте разделитель между ними
  • ещеотсутствует при подсчете, поэтому вы учитываете только до 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

...