c中阶乘中尾随零的数量

Number of Trailing Zeros in a Factorial in c

我是 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);
}

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

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

这个

if(ln=!0)

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

if (ln != 0)

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

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

中的正确语法
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) returns a 的最大整数或 a

的底数

{

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);

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

让我们记住数学(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;
}
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);
        }
    }
}

试试这个

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

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

我已经解决了这类问题,我认为你的问题只是找到阶乘数的尾随零的数量 比如 - 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?