题解 | #牛群的数量计算#

牛群的数量计算

https://www.nowcoder.com/practice/dfafaa65a55040b3a4b65418db68949d

使用位运算实现乘法即可!

分别采用累加(递归实现加法),模拟(迭代实现加法)

累加实现乘法

import java.util.*;
public class Solution {
    /**
     * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
     *
     * 
     * @param a 牧场 
     * @param b 牛 
     * @return 乘积
     */
    public int multiply (int a, int b) {
        // write code here
        //取绝对值//负数取反+1
        int multiplicand = a<0?add(~a,1):a;
        int multiplier = b<0?add(~b,1):b;
        int product = 0;
        int count=0;
        // 累加计算
        while(count<multiplier){
            product=add(product,multiplicand);
            count = add(count,1);
        }
        // 判断符号
        if((a^b)<0){
            product=add(~product,1);
        }
        return product;
    }
  //递归写法
    private int add(int a,int b){
        if(b==0)return a;
        int sum = a^b;
        int carry = (a&b)<<1;
        return add(sum,carry);
    }
}

模拟手算二进制乘法

(1) 判断乘数是否为0,为0跳转至步骤(4)

(2) 将乘数与1作与运算,确定末尾位为1还是为0,如果为1,则相加数为当前被乘数;如果为0,则相加数为0;将相加数加到最终结果中;

(3) 被乘数左移一位,乘数右移一位;回到步骤(1)

(4) 确定符号位,输出结果;

import java.util.*;


public class Solution {
    /**
     * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
     *
     *
     * @param a 牧场 
     * @param b 牛 
     * @return 乘积
     */
    public int multiply (int a, int b) {
        //将乘数和被乘数都取绝对值 
        int multiplicand = a < 0 ? add(~a, 1) : a;
        int multiplier = b < 0 ? add(~b, 1) : b;
        //计算绝对值的乘积  
        int product = 0;
        while (multiplier > 0) {
            if ((multiplier & 0x1) > 0) { // 每次考察乘数的最后一位
                product = add(product, multiplicand);
            }// 每运算一次,被乘数要左移一位    
            multiplicand = multiplicand <<1;
            // 每运算一次,乘数要右移一位(可对照上图理解)  
            multiplier = multiplier >>1;
        }
        //计算乘积的符号  
        if ((a ^ b) < 0) {
            product = add(~product, 1);
        }
        return product;
    }
    // 迭代写法
    private int add(int num1, int num2) {
        int sum = num1 ^ num2;
        int carry = (num1 & num2) << 1;
        while (carry != 0) {
            int a = sum;
            int b = carry;
            sum = a ^ b;
            carry = (a & b) << 1;
        }
        return sum;
    }
}

面试高频TOP202 文章被收录于专栏

面试高频TOP202题解

全部评论

相关推荐

2本硕,在这一个下午真的绷不住了,浪费了太多时间,现在的技术栈还停在C语言和stm32上,找嵌入式的实习面试被拷打,找杭州的一个也找不到,真的心里难受,linux没学过,研二了开始慌了。
一条淡水魚:嵌入式这行的面试我认为实际项目比较重要,技术栈简单的提一嘴就行,面试官在乎的关键点在于你用了这些技术做了哪些工作解决了什么问题,而不是停留在离散的那些个技术栈上,那除了教课没有意义,好比你提到的c语言和32,你用32做过哪些具体的项目?接触过什么外设?使用过哪些公司的SDK?有没有实际产品落地?以及各种只有进入真正的生产环节当中才会积累到的经验......主动去和面试官讨论这些实际的问题,甚至还能就某个具体参数的合理性与他去简单探讨一下,只要技术栈对口,基本上就稳啦~(另外linux和RTOS是嵌入式的标配哦,选一个方向走下去吧)
点赞 评论 收藏
分享
2025-12-19 21:53
门头沟学院 Java
想做OpenGL:不要一来就把自己定位这么低吧,把大厂当成目标,不断去学技术做项目,最后你至少能学到能找到中小厂的技术水平,你一上来就找这种两千块还要前后端都会的,其实对你用处不会很大,真去了也是打杂
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务