C语言程序,用于在给定编号的FACTORIAL末尾找到尾随的ZEROS

时间:2019-05-07 14:47:00

标签: c factorial trailing

我已经返回了代码以查找阶乘并在阶乘的末尾显示尾随零,但是输出错误...您能帮我找到错误吗?

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

3 个答案:

答案 0 :(得分:6)

您的代码仅适用于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}}

答案 1 :(得分:1)

您有两个问题

  • 您折叠两个输出,因此您只能看到其中一个/看不到谁是谁,只需在它们之间添加分隔符
  • 计数时会丢失另外一个,因此您最多只能计数到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

答案 2 :(得分:0)

#include <stdio.h>

int main()
{
    int n,i,f=1,t,c=0;
    printf("Enter  number ");
    scanf("%d",&n);
    t=n;
    for(i=1;t>=5;i++)
    {
        t=n/5;
        c=c+t;
        n=t;
    }
    printf("number of zeros are %d",c);

    return 0;
}