【问题标题】:C program to find the trailing ZEROS at the end of a FACTORIAL of a given numberC程序在给定数字的FACTORIAL末尾找到尾随零
【发布时间】:2019-09-25 06:30:30
【问题描述】:

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

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

【问题讨论】:

  • 这不是任务假设的方法。天真的在这里不会很好用,你需要考虑一个非平凡的算法。至于你的问题 - 你可能只是溢出整数。
  • 如果您还可以告诉我们您尝试了哪些输入以及收到了哪些结果,那就太好了。该错误可能是由许多事情引起的。编辑:当然有更简单的方法来做到这一点@EugeneSh。表示。把它想象成一个乘法。是什么导致你的结果最后是 0?
  • 你应该考虑另一种逻辑,因为我认为方法不对。
  • 要做到这一点而不会溢出,您只需计算每次乘以 5,例如 25! 25 乘以 5 两次,15、10 和 5 各乘一次。所以会有 5 个尾随零(注意有多余的 2 的倍数,将 5 变成 10 的倍数)
  • @AndrewHenle 您只能通过 5 * 2 获得十的倍数,而 10 的倍数是获得尾随零的唯一方法。

标签: c factorial trailing


【解决方案1】:

您的代码仅适用于非常小的 N 值:最多 9。对于稍大一些的值,您需要在 break 语句之前添加一个 else 关键字,这样您会在更多情况下得到正确的结果。

对于较大的值,您必须计算除以阶乘的 5 的幂。您可以通过将每个数字除以 N 的 5 的幂相加来逐步执行此操作。

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

【讨论】:

    【解决方案2】:

    你有两个问题

    • 您折叠两个输出,因此您只能看到其中一个/您看不到谁是谁,只需在它们之间添加一个分隔符
    • 计算时缺少一个 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

    【讨论】:

      【解决方案3】:
      #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;
      }
      

      【讨论】:

      • 我建议您在提供答案之前添加有关问题所在的详细信息。通过这种方式,人们可以学习,而不仅仅是获得解决方案。
      猜你喜欢
      • 2017-12-29
      • 1970-01-01
      • 2022-12-18
      • 1970-01-01
      • 1970-01-01
      • 2022-11-10
      • 2022-12-11
      • 1970-01-01
      • 2020-08-09
      相关资源
      最近更新 更多