【问题标题】:Number of Trailing Zeros in a Factorial in cc中阶乘中尾随零的数量
【发布时间】:2015-02-14 13:59:46
【问题描述】:

我是 C 编程新手 我想找出给定数字的阶乘中尾随零的数量

{
        long int n=0,facto=1,ln=0;
        int zcount=0,i=1;
        printf("Enter a number:");
        scanf("%ld",&n);
        if(n==0)
        {
          facto=1;
        }
        else
        {
           for(i=1;i<=n;i++)
           {
              facto=facto*i;
           }
        }
        printf("%ld",facto);
        while(facto>0)
        {
           ln=facto%10;
           facto/10;
           if(ln=!0)
           { 
               break;
           }
           else
           { 
               zcount+=1;
           }
        }
        printf("Tere are Total %d Trailing zeros in given factorial",zcount);
}

我试图计算将返回给定数字的最后一位作为余数的数字的模数,然后n/10; 将删除最后一个数字。

执行程序后,输出始终显示尾随零的数量为“0”,即使有零,条件if(ln =! 0)也始终满足。

【问题讨论】:

  • 正确的语法是if (ln != 0 )
  • 表达式n=!0!0 分配给n
  • “facto/10;”也没有多大作用。
  • @user3710044 是的,我注意到了我的错误。必须处理 5 的幂。它是所有 i 的 floor(n/5^i) 的总和,直到 5^i 大于 n。
  • 欢迎来到 StackOverflow。以“请尽快帮助我”结束你的问题,看起来你认为你的问题应该优先于这里每天提出的数千个其他问题,这可能会让一些可以帮助你的人望而却步。这种空洞的结论在这里通常也被认为是不好的礼仪(即使它不是自私的),就像随机大写单词一样。

标签: c factorial


【解决方案1】:

让我们记住数学 (wiki):

int trailingZeroCountInFactorial(int n)
{
  int result = 0;
  for (int i = 5; i <= n; i *= 5)
  {
    result += n / i;
    if(i > INT_MAX / 5) // prevent integer overflow
      break;
  }
  return result;
}

【讨论】:

    【解决方案2】:

    这个

    if(ln=!0)
    

    表示ln = !0,即您将!0分配给ln,因此条件始终为真,请将其更改为

    if (ln != 0)
    

    您可以将赋值用作真值,但前提是您确定自己正在这样做。

    为防止意外执行此操作,请打开编译器警告。

    【讨论】:

      【解决方案3】:

      正确的语法在

      if(ln!=0) 
      { 
          // do something     
      }
      

      if ( ln=!0 ) 中,首先评估!0,然后=!0(即1)分配给ln,然后if 检查ln 的值,如果该值是非零(在这种情况下它是 1 由于先前的分配)然后执行 break 语句。

      此外,这种方法不适用于大于 25 的数字。 很明显,n! 中 5 的幂就是答案。

      以下表达式给出了n! 中素数p 的幂:- f(n/p) + f(n/p^2) + f(n/p^3) + ..... (until f(n/p^k) return zero,其中f(a) 返回a 的最大整数或a 的下限

      【讨论】:

        【解决方案4】:
        package lb;
        
        import java.util.Scanner;
        
        public class l1 {
        
        public static void main(String[] args) {
            // TODO Auto-generated method stub
            Scanner s=new Scanner(System.in);
            int n=s.nextInt();
            int a=n/5;
                if(a<5)
                {
                System.out.println(a);
                }
                else
                {
                int c=a/5+a;
                System.out.println(c);
                }
            }
        }
        

        【讨论】:

          【解决方案5】:

          试试这个

          int trailingZeroCountInFactorial(int n)
          {
            int result = 0;
            for (int i = 5; i <= n; i *= 5)
            {
              result += n / i;
            }
            return result;
          }
          

          要学习,它是如何工作的,有一个很好的解释here

          【讨论】:

            【解决方案6】:

            我已经解决了这种问题,我认为你的问题只是找到一个阶乘数字的尾随零的数量,例如 - 15! = 1307674368000 if you look at the trailing 3 digits which are 000 Efficient code is

            
              int n;cin>>n; 
              int ans = 0;
               while(n)
               { ans += (n = n/5);}
               cout<<ans;
            

            这里应该寻找 int 溢出,数组边界。另外,特殊情况是n=1?

            【讨论】:

              【解决方案7】:

              {

              long int n=0,facto=1,ln=0;
              int zcount=0,i=1;
              printf("Enter a number:");
              scanf("%ld",&n);
              if(n==0)
              {
                facto=1;
              }
              else
              {
                 for(i=1;i<=n;i++)
                 {
                    facto=facto*i;
                 }
              }
              printf("%ld\n",facto);
              while(facto>0)
              {
                 ln=(facto%10);
                 facto/=10;  //here you done one mistake
                 if(ln!=0)   //another one here
                 {
                     break;
                 }
                 else
                 {
                     zcount+=1;
                 }
              }
              printf("Tere are Total %d Trailing zeros in given factorial",zcount);
              

              } /运行这段代码,它现在可以工作,我猜你已经知道的错误/

              【讨论】:

                猜你喜欢
                • 1970-01-01
                • 1970-01-01
                • 2012-06-06
                • 2018-11-06
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 2022-11-10
                • 1970-01-01
                相关资源
                最近更新 更多