每日算法之a+b和尾部零的算法

本文介绍了一种不使用基本算术运算实现两数相加的方法,并详细解释了利用位运算符实现该功能的具体步骤。此外,还提供了一个高效算法用于计算n!尾部零的数量,该算法避免了直接计算阶乘所带来的数值溢出问题。

一、a+b问题

a=1,b=2,不使用加减乘除,来实现a+b的效果。(可以使用位操作符)

算法思路:
①1+1=0,0+0=0,1+0=1,可以看出和异或产生的效果类似。
②上面的加法虽然可以用异或来实现,但是还有1+1的进位问题,可以用另一种方式解决,比方说:1+1=0,可以通过1&1,为0,同时,将其左移一位即可获取进位。
③接着就是将①和②的结果加起来即可。

 public int aplusb(int a, int b) {
        // 核心思想通过递归实现
        if(b == 0)
            return a;
        int sum = a ^ b;
        int carry = (a & b)<<1;
        return aplusb(sum,carry);
 }

二、尾部的零

设计一个算法,计算出n阶乘中尾部零的个数

我的思路是(不对):①先算出n阶乘,接着对某个数计算尾部0的个数。

  public long trailingZeros(long n) {
        long s = factorial(n) ;
        long x = 10 ;
        long count = 0 ;
        try {
            while(s%x==0){
                count++ ;
                x = x * 10 ;
            }
        }catch (Exception e){
            e.printStackTrace();
        }
        return count;
    }

    public long factorial(long n){
        if(n==0){
            return 1 ;
        }
        return n * factorial( n -1 ) ;
    }

存在的问题:比较小的数据还能正常运行,一旦数据大的话,求阶乘就会出问题。

其实这个题目真正做法不应该是这样,核心在于什么样的数相乘会产生尾部为0,重点在5,只要是个偶数乘以5都可以产生尾部为0的数,而且如果产生了第一个0,后面不管乘以什么数这个0都不会消失,后续只会叠加,所以说只要遍历n、n/5….即可。

 public long trailingZeros(long n) {
       long num = 0 ;
       while(n>0){
           num += n/5 ;
           n=n/5 ;
       }
       return num ;
    }
【SCI一区复现】基于配电网韧性提升的应急移动电源预配置动态调度(下)—MPS动态调度(Matlab代码实现)内容概要:本文档围绕“基于配电网韧性提升的应急移动电源预配置动态调度”主题,重点介绍MPS(Mobile Power Sources)动态调度的Matlab代码实现,是SCI一区论文复现的技术资料。内容涵盖在灾害或故障等极端场景下,如何通过优化算法对应急移动电源进行科学调度,以提升配电网在突发事件中的恢复能力与供电可靠性。文档强调采用先进的智能优化算法进行建模求解,并结合IEEE标准测试系统(如IEEE33节点)进行仿真验证,具有较强的学术前沿性工程应用价值。; 适合人群:具备电力系统基础知识Matlab编程能力,从事电力系统优化、配电网韧性、应急电源调度等相关领域研究的研究生、科研人员及工程技术人员。; 使用场景及目标:①用于复现高水平期刊(SCI一区、IEEE顶刊)中关于配电网韧性与移动电源调度的研究成果;②支撑科研项目中的模型构建与算法开发,提升配电网在故障后的快速恢复能力;③为电力系统应急调度策略提供仿真工具与技术参考。; 阅读建议:建议结合前篇“MPS预配置”内容系统学习,重点关注动态调度模型的数学建模、目标函数设计与Matlab代码实现细节,建议配合YALMIP等优化工具包进行仿真实验,并参考文中提供的网盘资源获取完整代码与数据。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值