IOS面试算法题(1)——N阶乘最后总位数的问题

今天给大家介绍几种关于阶乘的算法,在ios或者其他的面试中比较常见。

//
//  main.c
//  N阶乘最后总位数的问题
//
//  Created by qianfeng on 15/12/11.
//  Copyright (c) 2015年 cuixuerui. All rights reserved.



//

#include <stdio.h>

#include <math.h>

/*
 
 这是一道国外Apple公司的面试题,需要高等数学知识
 
 输入任意一个数字N(N>=1) 算出N的阶乘(N!)一共有多少位
 
 比如输入10
 10! = 3628800
 10的阶乘是 3628800
 位数为7
 
 在比如输入25
 25! = 15511210043330985984000000
 一共有 26位
 
 注意不能把某个数的阶乘算出在统计位数

 */


int main(int argc, const char * argv[]) {
    // insert code here...
    int num;
    
    double count=0;//设置一个double类型的变量记录
 
    scanf("%d",&num);
 
    /*
     
         //思路:log10^n!=log10(1*2*3*4*...*n)
         //     M=log10(1)+log10(2)+log10(3)+...+log10(n)
                其实这用到的是高中的一下知识吧
                大家也可以用

   */

    for (int i=1; i<=num; i++) {
        
        count=count+log10(i);
    }
    
    printf("%d",(int)count+1);
    
    
    return 0;
}




今天时间不是很充裕,就先讲一下N阶乘最后总位数的问题。明天再给大家介绍任意数阶乘最后零的个数的问题,这里先给大家思路,大家可以试着做一下

1、求任意阶乘最后的个数其实就是看其中有几个5,有几个5就有几个0,什么意思呢?

比如:1*2*3*4*5*6*7*8*9*(5*2)*11*12*13*14*(3*5)*16*...*(n-1)*n

就是这样,看总共包含几个5,阶乘最后就有几个0

给大家一些数据进行参考

0! = 1
1! = 1
2! = 2
3! = 6
4! = 24
5! = 120
6! = 720
7! = 5040
8! = 40320
9! = 362880
10! = 3628800
11! = 39916800
12! = 479001600
13! = 6227020800
14! = 87178291200
15! = 1307674368000
16! = 20922789888000
17! = 355687428096000
18! = 6402373705728000
19! = 121645100408832000
20! = 2432902008176640000
21! = 51090942171709440000
22! = 1124000727777607680000
23! = 25852016738884976640000
24! = 620448401733239439360000
25! = 15511210043330985984000000
26! = 403291461126605635584000000
27! = 10888869450418352160768000000
28! = 304888344611713860501504000000
29! = 8841761993739701954543616000000
30! = 265252859812191058636308480000000
31! = 8222838654177922817725562880000000
32! = 263130836933693530167218012160000000
33! = 8683317618811886495518194401280000000
34! = 295232799039604140847618609643520000000
35! = 10333147966386144929666651337523200000000
36! = 371993326789901217467999448150835200000000
37! = 13763753091226345046315979581580902400000000
38! = 523022617466601111760007224100074291200000000
39! = 20397882081197443358640281739902897356800000000
40! = 815915283247897734345611269596115894272000000000
41! = 33452526613163807108170062053440751665152000000000
42! = 1405006117752879898543142606244511569936384000000000
43! = 60415263063373835637355132068513997507264512000000000
44! = 2658271574788448768043625811014615890319638528000000000
45! = 119622220865480194561963161495657715064383733760000000000
46! = 5502622159812088949850305428800254892961651752960000000000
47! = 258623241511168180642964355153611979969197632389120000000000
48! = 12413915592536072670862289047373375038521486354677760000000000
49! = 608281864034267560872252163321295376887552831379210240000000000
50! = 30414093201713378043612608166064768844377641568960512000000000000

你可能感兴趣的:(阶乘,面试题,C语言,位数)