不用乘除号做除法

前言

计算机运算以二进制为基础,而二进制的基本运算不是加减乘除,而是与或非异或、位运算。当然这些运算灵活组合运用同样实现数字本有的加减乘除规范。

一、案例

1、加法

设计一个函数把两个数字相加。不得使用 + 或者其他算术运算符。

示例:
输入: a = 1, b = 1
输出: 2

2、除法

给定两个整数 a 和 b ,求它们的除法的商 a/b ,要求不得使用乘号 ‘*’、除号 ‘/’ 以及求余符号 ‘%’ 。
在这里插入图片描述

二、题解

class Solution {
    public int add(int a, int b) {
        //用与运算和右移得到进位数,通过异或运算得到没有进位的数,然后两者相加
        int temp;
        while(a != 0){
            temp = (a & b) << 1;
            b = a ^ b;
            a = temp;
        }
        return b;
    }
}
package com.xhu.offer.tencent;

//整数除法
public class Divide {
    //其中有一个规律 n << count = (1 << count) * n;说白了右移就是扩大了2的倍数倍。那么除n的就应该1 << count位
    public int divide(int a, int b) {
        int res = 0;
        //溢出情况
        if (a == Integer.MIN_VALUE && b == -1) return Integer.MAX_VALUE;
        //结果为0的情况
        if (a == 0) return 0;
        if (a == b) return 1;
        //得到结果是否为正
        boolean mark = a < 0 && b < 0 || a > 0 && b > 0;
        //由于负数转整数可能溢出,所以统一负数处理
        if (a > 0) a = -a;
        if (b > 0) b = -b;
        int count = 0;

        while (a < b << count) {
            //判断是否存在溢出情况,若有,上一轮的判断条件不算,count++不算
            if (count != 0 && b << count - 1 < b << count) {
                count--;
                break;
            }
            count++;
        }
        if (b << count + 1 == a) return (1 << count + 1);
        while (count >= 0) {
            if (a <= b << count) {
                res -= 1 << count;
                a -= b << count;
            }
            count--;
        }
        return mark ? -res : res;
    }

    public static void main(String[] args) {
        System.out.println(-3 << 29);
        System.out.println(-2147483648 * -1);
        System.out.println(Integer.MAX_VALUE + 1);
    }
}

总结

1)掌握与或非异或及位运算怎么算,以及它们各自的特点是什么,它们之间组合能实现所有数字规范。

参考文献

[1]LeetCode 加法
[1]LeetCode 除法

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
好的,以下是用 Java 编写的一个简单的 GUI 计算器,可以实现加减乘除的功能。如果除数为 0,会弹出一个对话框提示用户输入错误。 ```java import javax.swing.*; import java.awt.*; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; public class Calculator extends JFrame implements ActionListener { private JTextField textField; private JButton button0, button1, button2, button3, button4, button5, button6, button7, button8, button9; private JButton buttonAdd, buttonSubtract, buttonMultiply, buttonDivide, buttonEqual, buttonClear; private double num1 = 0, num2 = 0, result = 0; private String operator = ""; public Calculator() { setTitle("Calculator"); setSize(300, 300); setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); textField = new JTextField(10); textField.setEditable(false); textField.setHorizontalAlignment(JTextField.RIGHT); button0 = new JButton("0"); button1 = new JButton("1"); button2 = new JButton("2"); button3 = new JButton("3"); button4 = new JButton("4"); button5 = new JButton("5"); button6 = new JButton("6"); button7 = new JButton("7"); button8 = new JButton("8"); button9 = new JButton("9"); buttonAdd = new JButton("+"); buttonSubtract = new JButton("-"); buttonMultiply = new JButton("*"); buttonDivide = new JButton("/"); buttonEqual = new JButton("="); buttonClear = new JButton("C"); button0.addActionListener(this); button1.addActionListener(this); button2.addActionListener(this); button3.addActionListener(this); button4.addActionListener(this); button5.addActionListener(this); button6.addActionListener(this); button7.addActionListener(this); button8.addActionListener(this); button9.addActionListener(this); buttonAdd.addActionListener(this); buttonSubtract.addActionListener(this); buttonMultiply.addActionListener(this); buttonDivide.addActionListener(this); buttonEqual.addActionListener(this); buttonClear.addActionListener(this); JPanel buttonPanel = new JPanel(); buttonPanel.setLayout(new GridLayout(4, 4)); buttonPanel.add(button7); buttonPanel.add(button8); buttonPanel.add(button9); buttonPanel.add(buttonDivide); buttonPanel.add(button4); buttonPanel.add(button5); buttonPanel.add(button6); buttonPanel.add(buttonMultiply); buttonPanel.add(button1); buttonPanel.add(button2); buttonPanel.add(button3); buttonPanel.add(buttonSubtract); buttonPanel.add(button0); buttonPanel.add(buttonEqual); buttonPanel.add(buttonClear); buttonPanel.add(buttonAdd); setLayout(new BorderLayout()); add(textField, BorderLayout.NORTH); add(buttonPanel, BorderLayout.CENTER); } @Override public void actionPerformed(ActionEvent e) { String buttonText = e.getActionCommand(); if (buttonText.equals("C")) { textField.setText(""); num1 = 0; num2 = 0; result = 0; operator = ""; } else if (buttonText.equals("+")) { num1 = Double.parseDouble(textField.getText()); operator = "+"; textField.setText(""); } else if (buttonText.equals("-")) { num1 = Double.parseDouble(textField.getText()); operator = "-"; textField.setText(""); } else if (buttonText.equals("*")) { num1 = Double.parseDouble(textField.getText()); operator = "*"; textField.setText(""); } else if (buttonText.equals("/")) { num1 = Double.parseDouble(textField.getText()); operator = "/"; textField.setText(""); } else if (buttonText.equals("=")) { num2 = Double.parseDouble(textField.getText()); if (operator.equals("+")) { result = num1 + num2; } else if (operator.equals("-")) { result = num1 - num2; } else if (operator.equals("*")) { result = num1 * num2; } else if (operator.equals("/")) { if (num2 == 0) { JOptionPane.showMessageDialog(null, "除数不能为0", "错误", JOptionPane.ERROR_MESSAGE); textField.setText(""); return; } else { result = num1 / num2; } } textField.setText("" + result); } else { textField.setText(textField.getText() + buttonText); } } public static void main(String[] args) { Calculator calculator = new Calculator(); calculator.setVisible(true); } } ``` 这个计算器采用了 Java 的 Swing 框架来实现 GUI,使用了 GridLayout 来布局按钮。当用户点击操作符按钮时,记录下当前的数字和操作符,当用户点击等按钮时,根据当前的操作符计算结果并显示在文本框中。当用户点击清除按钮时,清空文本框和记录的数字和操作符。当用户点击除法操作符并且除数为 0 时,会弹出一个对话框提示用户输入错误。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值