C语言面试(三)

版权声明: https://blog.csdn.net/qq_41880190/article/details/80494642

数学算法解决C语言问题

N!结果中0的个数 

99!结果中后面有多少个0?
如果你能一个一个乘出来我算你狠!我也佩服你!
0也就意味着乘积是10的倍数,有10的地方就有5.有5就不担心没2.10以内能被5整除的只有5,但是能被2整除多的去了。所以就简化成了这个数只要有一个因子5就一定对应一个0.
所以可以得出下面结论:
    当0 < n < 5时,f(n!) = 0;
    当n >= 5时,f(n!) = k + f(k!), 其中 k = n / 5(取整)。

#include<stdio.h>   
int fun(int iValue)   
{   
    int iSum = 0;
    while(iValue / 5 != 0)   
    {   
        iSum     += (iValue / 5 );   
        iValue  /= 5;   
    }   
    return iSum;   
}   
  
int main( int argc , char *argv[] )   
{   
    int iNumber, iZoreNumber;  
    scanf( "%d", &iNumber);   
    iZoreNumber = fun(iNumber);   
    printf( "%d\n", iZoreNumber); 
    return 0;   
}

以99!后面有多少个0的答案是:99 / 5 = 19 , 19 / 5 = 3 ; 3 / 5 = 0 .也就是:19 + 3 + 0 = 22.
这里延伸为N!呢,一样的,万变不离其宗!
N!结果中的位数 
请问N!结果中有几位数?
我们先假设:N! = 10 ^A,我们知道 10^1~10^2(不含10^2)之间是2位数,10^2~10^3(不含10^3)之间是3位数,以此类推,10^A~10^(A+1)(不含10^(A+1))则是(A+1)位数,那就是说,我们只要求出A,即可知道N!有几位数。A=log10(N!),
N!= 1*2*3……*N,那么A= log10(1)+log10(2)+……+log10(N).

#include <stdio.h>
#include <math.h>
int main(int argc, char *argv[])
{
    int iNumber , i = 0 ;
    double sum = 0 ;
    printf("请输入iNumber :");
    scanf( "%d" , &iNumber );
    for( i = 1 ; i < ( iNumber + 1 ) ; i++) 
    {
        sum += log10(i) ;
    }
    printf(" N!有%d位 \n" , (int)sum  +  1  ) ;
    return 0;
}

阅读更多
想对作者说点什么? 我来说一句

没有更多推荐了,返回首页