鱼C论坛

 找回密码
 立即注册
查看: 1360|回复: 6

[已解决]关于阶乘运行时间优化问题

[复制链接]
发表于 2021-10-10 17:04:50 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
题目要求算出结果末尾0的个数(因为它也知道数值很大),下面是我的代码,运行时间超时
举个例子:999999998的阶乘末尾有多少个0  答案是249999989
#include<stdio.h>

int main() {
        long long int a, sum = 1;
        scanf("%lld", &a);
        while (a > 0) {       // 阶乘
                sum *= a;      
                a--;
        }
        int i;
        for (i = 0;; i++) {        // 计算末尾0个数
                if (sum % 10 == 0) {      // 检查末尾是否存在0
                        sum /= 5;  
                }
                else
                        break;
        }
        printf("%d", i);
        return 0;
}
最佳答案
2021-10-10 19:34:19
本帖最后由 jhq999 于 2021-10-10 20:34 编辑
int i=0,len5=0,len2=0,tmp=0,num=999999998;
        i=2;
        while(i<=num)
        {
                if(0==i%2)
                {
                        tmp=i;
                        while(tmp>0&&!(tmp%2))
                        {
                                len2++;
                                tmp/=2;

                        }

                }
                i+=2;
        }
        i=5;
        while(i<=num)
        {
                
                if(0==i%5)
                {
                        tmp=i;
                        while(tmp>0&&!(tmp%5))
                        {
                                len5++;
                                tmp/=5;

                        }

                }
                i+=5;
        }
        printf("%d",len2<len5?len2:len5);
        return 0;
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2021-10-10 17:05:38 | 显示全部楼层
面对巨大数值的运算而导致运行超时的,一般怎么解决这类问题
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2021-10-10 17:08:42 | 显示全部楼层
只需要求0的个数何必求阶乘
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2021-10-10 18:03:49 | 显示全部楼层
提供个思路
只有两种情况:5的奇数倍和偶数相乘后积后面带0,而5的偶数倍自己带0。
2×5=10;
10;
4×15=60;
20
6×25=150;
30
8×35=280;
40
12×45=540
45!就是9个零
50
14×55=??

……
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2021-10-10 19:34:19 | 显示全部楼层    本楼为最佳答案   
本帖最后由 jhq999 于 2021-10-10 20:34 编辑
int i=0,len5=0,len2=0,tmp=0,num=999999998;
        i=2;
        while(i<=num)
        {
                if(0==i%2)
                {
                        tmp=i;
                        while(tmp>0&&!(tmp%2))
                        {
                                len2++;
                                tmp/=2;

                        }

                }
                i+=2;
        }
        i=5;
        while(i<=num)
        {
                
                if(0==i%5)
                {
                        tmp=i;
                        while(tmp>0&&!(tmp%5))
                        {
                                len5++;
                                tmp/=5;

                        }

                }
                i+=5;
        }
        printf("%d",len2<len5?len2:len5);
        return 0;
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2021-10-10 19:39:44 | 显示全部楼层
本帖最后由 jhq999 于 2021-10-10 20:20 编辑

把所有5的倍数分解成里面有多少5,
例:125=5×5×5;75=5×5×3;
3个加上2个5=5个5,以此类推999999998!可以分解到249999989个5;
又可以分解到799999999个不是5的倍数个2,够5乘的,所有相乘挂0的数的都多少个2×5=10

125×8=1000,5×5×5×2×2×2=1000
10!=10×9×8×7×6×5×4×3×2×1=2×5×9×7×……×5×……×1;
2个5,8个2 所以结果后面挂2个0
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2021-10-11 21:38:42 | 显示全部楼层
jhq999 发表于 2021-10-10 19:39
把所有5的倍数分解成里面有多少5,
例:125=5×5×5;75=5×5×3;
3个加上2个5=5个5,以此类推999999998 ...

可以,学到了。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-9-22 14:19

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表