[解题报告]《C语言入门100例》(第7例) 给定 n,求 1 × 2 × 3 × ... × n 的乘积

简介: [解题报告]《C语言入门100例》(第7例) 给定 n,求 1 × 2 × 3 × ... × n 的乘积

零、写在前面


       这个系列不经常更新,今天这个题目又觉得有点意思,我们一起看一看,主要知识点在


《C语言入门100例》(第7例) n!

https://blog.csdn.net/WhereIsHeroFrom/article/details/118208252


一、主要知识点


       1.给定 n,求 1 × 2 × 3 × ... × n 的乘积

int ans = 0,n;
while(n) {            
    ans *= n;        
    --n;             
}

二、课后习题


  面试题 16.05. 阶乘尾数


面试题 16.05. 阶乘尾数

https://leetcode-cn.com/problems/factorial-zeros-lcci/


     思路


       这道题就是让求尾数0的个数,要产生一个0,那么因子里必有一个5一个2,n!每两个数字就有一个为偶数,也就是包含2因子,但是每五个才包含一个5因子,所以我们统计多少个5末尾就会又多少个0。


       如果一个数字是5的多少倍那么就会贡献多少个5因子,同时5^2会贡献两个,第一次算过了就可以只算贡献一个。5^3贡献的三个前两个被5^1和5^2给计算过了,所以也是加一次就好了。代码如图。


int trailingZeroes(int n){
    int i = 0,ans = 0,temp = 1;
    for(i = 0;temp <= n && temp < 429496730;i ++){
        temp *= 5;            //穷举所有的5的指数
        ans += n / temp;    //计算5因子个数
    }
    return ans;
}

结果分析


image.png


我就是觉得4ms和0ms没差别-.-


793. 阶乘函数后 K 个零


793. 阶乘函数后 K 个零

https://leetcode-cn.com/problems/preimage-size-of-factorial-zeroes-function/


思路


这道题和第一题很类似,只要找出来相应的x拥有k个零那么就返回5,否则就是0,因为一定有5a ,5a+1,5a+2.5a+3,5a+4五个数字拥有相同的0的个数。


利用二分查找相应的x,差找范围是 k- 5*k +1,原因是含有k个零的元素最小是k,最大不超过5*k+1,原因是5*k就含有k个5的倍数,这个数字含有的零元一定比k多。+1是为了统一0的处理。

long zeta(long x){            //判断x又多少个0
    if(!x) return 0;          //递归出口      
    return x / 5 + zeta(x / 5); //分解x!中包含的5因子个数
}
int preimageSizeFZF(int k){
    long low = k,high = (long)k * 5 +1;//从k-k*5+1中寻找是否有满足要求的解
    while(low < high){                  
        long mid = (low + high) /2;     
        long zmi = zeta(mid);       
        if(zmi == k) return 5;          //找到则返回
        else if(zmi < k) low = mid +1;  
        else high = mid;                
    }
    return 0;                           //没找到返回0
}



结果分析

image.png



凑合玩吧。。


写在最后


这个系列确实是不怎么更新,但是我觉得有难度的题都会进行更新,所以还是建立一个合集,有需要的欢迎关注。


相关文章
|
2月前
|
C语言
王桂林C语言从放弃到入门课程
课程目标16天,每天6节课,每节40分钟课堂实录,带你征服C语言,让所有学过和没有学过C语言的人,或是正准备学习C语言的人,找到学习C语言的不二法门。适用人群所有学过和没有学过C语言的人,或是正准备学习C语言的人!
26 2
王桂林C语言从放弃到入门课程
|
2月前
|
存储 编译器 C语言
初识C语言——详细入门(系统性学习day4)
初识C语言——详细入门(系统性学习day4)
|
2月前
|
存储 自然语言处理 编译器
C语言从入门到实战——编译和链接
在C语言中,编译和链接是将源代码转换为可执行文件的两个主要步骤。 编译过程包括以下步骤: 1. 预处理:将源代码中的预处理指令(如`#include`和`#define`)替换为实际的代码。 2. 编译:将预处理后的代码转换为汇编语言。 3. 汇编:将汇编语言转换为机器码指令。 链接过程包括以下步骤: 1. 目标文件生成:将每个源文件编译后生成的目标文件(`.o`或`.obj`)进行合并,生成一个总的目标文件。 2. 符号解析:查找并解析目标文件中的所有符号(例如全局变量和函数名),以确保每个符号都有一个唯一的地址。 3. 地址重定位:根据符号表中符号的地址信息,将目标文件中的所有地址引用
42 0
|
2月前
|
编译器 程序员 C语言
C语言从入门到实战——动态内存管理
在C语言中,动态内存管理是指程序运行时,通过调用特定的函数动态地分配和释放内存空间。动态内存管理允许程序在运行时根据实际需要来分配内存,避免了静态内存分配在编译时就确定固定大小的限制。
46 0
|
2月前
|
编译器 Linux PHP
C语言从入门到实战——预处理详解
C语言预处理是C语言编译过程的一个阶段,它在编译之前对源代码进行一系列的处理操作,包括宏替换、文件包含、条件编译等,最终生成经过预处理的代码,然后再进行编译。
47 0
|
2月前
|
存储 缓存 C语言
C语言从入门到实战——文件操作
C语言中的文件操作是通过使用文件指针来实现的。可以使用标准库中的函数来打开、读取、写入和关闭文件。
57 0
|
16天前
|
存储 自然语言处理 编译器
振南技术干货集:振南当年入门C语言和单片机的那些事儿(3)
振南技术干货集:振南当年入门C语言和单片机的那些事儿(3)
|
13天前
|
编译器 C语言
函数深入解析(C语言基础入门)
函数深入解析(C语言基础入门)
|
13天前
|
C语言
数组深入剖析(C语言基础入门)
数组深入剖析(C语言基础入门)
|
16天前
|
算法 C语言 芯片
振南技术干货集:振南当年入门C语言和单片机的那些事儿(1)
振南技术干货集:振南当年入门C语言和单片机的那些事儿(1)