Java实现复数(二十一)

简介: Java实现复数(二十一)

一. 复数


关于数学中复数的概念和作用,可以百度搜索相关的内容。


把运算法则 复制一下:


20200611090531127.png


复数有两个属性, 实部 real 和虚部 imag.


一.一 复数 模的大小 magnitude()


 /**
     *
     * @return 返回复数的大小
     */
    public double magnitude(){
        double d= Math.sqrt(this.real*this.real+this.imag*this.imag);
        //四位小数,并且去0
        return Double.valueOf(new BigDecimal(d).
                setScale(4, BigDecimal.ROUND_HALF_UP).stripTrailingZeros()
                .toString());
    }


一.二 是否为纯虚数 pure()


/**
     *
     * @return 是否是纯虚数。 实部为0,虚部不为0,才是纯虚数
     */
    public boolean pure(){
        return pure(this);
    }
    /**
     *
     * @param other
     * @return 是否是纯虚数。 实部为0,虚部不为0,才是纯虚数
     */
    public static boolean pure(Complex other){
        if(other.getReal()==0&&other.getImag()!=0){
            return true;
        }
        return false;
    }


一.三 是否为共轭复数 conjugate()


/**
     *
     * @return 是否是共轭复数。 实部相同,虚部互为相反数
     */
    public boolean conjugate(Complex other){
        return conjugate(this,other);
    }
    /**
     *
     * @param c1
     * @param c2
     * @return 是否是共轭复数。 实部相同,虚部互为相反数
     */
    public static boolean conjugate(Complex c1,Complex c2){
        if(c1.getReal()==c2.getReal()&&(c1.getImag()+c2.getImag())==0){
            return true;
        }
        return false;
    }


一.四 复数加法 add()


/**
     *
     * @param other
     * @return 复数相加
     */
    public Complex add(Complex other){
        return add(this,other);
    }
    /**
     *
     * @param c1
     * @param c2
     * @return 静态方法,实现两个复数相加
     */
    public static Complex add(Complex c1,Complex c2){
        //新的实部
        double r=c1.getReal()+c2.getReal();
        //新的虚部
        double i=c1.getImag()+c2.getImag();
        //相加后的复数
        return new Complex(r,i);
    }


一.五 复数的减法 substract()


/**
     *
     * @param other
     * @return 复数相减
     */
    public Complex substract(Complex other){
        return substract(this,other);
    }
    /**
     *
     * @param c1
     * @param c2
     * @return 静态方法,实现两个复数相减
     */
    public static Complex substract(Complex c1,Complex c2){
        //新的实部
        double r=c1.getReal()-c2.getReal();
        //新的虚部
        double i=c1.getImag()-c2.getImag();
        //相减后的复数
        return new Complex(r,i);
    }


一.六 复数乘法 multiply ()


 /**
     *
     * @param other
     * @return 复数相乘
     */
    public Complex multiply(Complex other){
        return multiply(this,other);
    }
    /**
     *
     * @param c1
     * @param c2
     * @return 静态方法,实现两个复数相乘
     */
    public static Complex multiply(Complex c1,Complex c2){
        //新的实部
        double r=c1.getReal()*c2.getReal()-c1.getImag()*c2.getImag();
        //新的虚部
        double i=c1.getReal()*c2.getImag()+c1.getImag()*c2.getReal();
        //相乘后的复数
        return new Complex(r,i);
    }


一.七 复数除法 divide()


/**
     *
     * @param other
     * @return 复数相除
     */
    public Complex divide(Complex other){
        return divide(this,other);
    }
    /**
     *
     * @param c1
     * @param c2
     * @return 静态方法,实现两个复数相除
     */
    public static Complex divide(Complex c1,Complex c2){
        //如果为0,表示除以0, 产生除0异常。
        if(c2.getReal()==0&&c2.getImag()==0){
            throw new ArithmeticException("除 0 异常");
        }
        //新的实部
        double r=(c1.getReal()*c2.getReal()+c1.getImag()*c2.getImag())/(c2.getReal()*c2.getReal()+c2.getImag()*c2.getImag());
        //新的虚部
        double i=(c1.getImag()*c2.getReal()-c1.getReal()*c2.getImag())/(c2.getReal()*c2.getReal()+c2.getImag()*c2.getImag());
        //相乘后的复数
        return new Complex(r,i);
    }


一.八 复数比较是否相同 equals() 和hashcode()


/**
     *
     * @param o
     * @return  比较两个复数是否相同
     */
    @Override
    public boolean equals(Object o) {
        if (this == o) return true;
        if (o == null || getClass() != o.getClass()) return false;
        Complex complex = (Complex) o;
        return Double.compare(complex.real, real) == 0 &&
                Double.compare(complex.imag, imag) == 0;
    }
    @Override
    public int hashCode() {
        return Objects.hash(real, imag);
    }


一.九 打印复数 toString()


 /**
     *
     * @return 打印展示复数
     */
    @Override
    public String toString() {
       StringBuilder sb=new StringBuilder();
       //保留四位小数,并且去0.
       String tempR=new BigDecimal(this.real).
               setScale(4, BigDecimal.ROUND_HALF_UP).stripTrailingZeros().toString();
       sb.append(tempR);
        //如果虚部为正,需要添加一个+号。 为-时,不需要添加
        if(this.imag>0){
            sb.append("+");
        }
        //如果为0,返回实部
        if(this.imag==0){
            return sb.toString();
        }
       //添加虚部, 复数后面的 i是固定的
        String tempI=new BigDecimal(this.imag).
                setScale(4, BigDecimal.ROUND_HALF_UP).stripTrailingZeros().toString();
        sb.append(tempI);
        sb.append("i");
       return sb.toString();
    }


二. 复数的汇总和测试


二.一 复数类 Complex


package com.yjl.collection;
import java.math.BigDecimal;
import java.util.Objects;
/**
 * package: com.yjl.collection
 * className: Complex
 * Description: 数学中复数类
 *
 * @author : yuezl
 * @Date :2020/6/11 7:54
 */
public class Complex {
    /**
     * @param real 实部
     * @param imag 虚部
     */
    private double real;
    private double imag;
    public Complex() {
    }
    public Complex(double real, double imag) {
        this.real = real;
        this.imag = imag;
    }
    /**
     *
     * @return 返回复数的大小
     */
    public double magnitude(){
        double d= Math.sqrt(this.real*this.real+this.imag*this.imag);
        //四位小数,并且去0
        return Double.valueOf(new BigDecimal(d).
                setScale(4, BigDecimal.ROUND_HALF_UP).stripTrailingZeros()
                .toString());
    }
    /**
     *
     * @return 是否是纯虚数。 实部为0,虚部不为0,才是纯虚数
     */
    public boolean pure(){
        return pure(this);
    }
    /**
     *
     * @param other
     * @return 是否是纯虚数。 实部为0,虚部不为0,才是纯虚数
     */
    public static boolean pure(Complex other){
        if(other.getReal()==0&&other.getImag()!=0){
            return true;
        }
        return false;
    }
    /**
     *
     * @return 是否是共轭复数。 实部相同,虚部互为相反数
     */
    public boolean conjugate(Complex other){
        return conjugate(this,other);
    }
    /**
     *
     * @param c1
     * @param c2
     * @return 是否是共轭复数。 实部相同,虚部互为相反数
     */
    public static boolean conjugate(Complex c1,Complex c2){
        if(c1.getReal()==c2.getReal()&&(c1.getImag()+c2.getImag())==0){
            return true;
        }
        return false;
    }
    /**
     *
     * @param other
     * @return 复数相加
     */
    public Complex add(Complex other){
        return add(this,other);
    }
    /**
     *
     * @param c1
     * @param c2
     * @return 静态方法,实现两个复数相加
     */
    public static Complex add(Complex c1,Complex c2){
        //新的实部
        double r=c1.getReal()+c2.getReal();
        //新的虚部
        double i=c1.getImag()+c2.getImag();
        //相加后的复数
        return new Complex(r,i);
    }
    /**
     *
     * @param other
     * @return 复数相减
     */
    public Complex substract(Complex other){
        return substract(this,other);
    }
    /**
     *
     * @param c1
     * @param c2
     * @return 静态方法,实现两个复数相减
     */
    public static Complex substract(Complex c1,Complex c2){
        //新的实部
        double r=c1.getReal()-c2.getReal();
        //新的虚部
        double i=c1.getImag()-c2.getImag();
        //相减后的复数
        return new Complex(r,i);
    }
    /**
     *
     * @param other
     * @return 复数相乘
     */
    public Complex multiply(Complex other){
        return multiply(this,other);
    }
    /**
     *
     * @param c1
     * @param c2
     * @return 静态方法,实现两个复数相乘
     */
    public static Complex multiply(Complex c1,Complex c2){
        //新的实部
        double r=c1.getReal()*c2.getReal()-c1.getImag()*c2.getImag();
        //新的虚部
        double i=c1.getReal()*c2.getImag()+c1.getImag()*c2.getReal();
        //相乘后的复数
        return new Complex(r,i);
    }
    /**
     *
     * @param other
     * @return 复数相除
     */
    public Complex divide(Complex other){
        return divide(this,other);
    }
    /**
     *
     * @param c1
     * @param c2
     * @return 静态方法,实现两个复数相除
     */
    public static Complex divide(Complex c1,Complex c2){
        //如果为0,表示除以0, 产生除0异常。
        if(c2.getReal()==0&&c2.getImag()==0){
            throw new ArithmeticException("除 0 异常");
        }
        //新的实部
        double r=(c1.getReal()*c2.getReal()+c1.getImag()*c2.getImag())/(c2.getReal()*c2.getReal()+c2.getImag()*c2.getImag());
        //新的虚部
        double i=(c1.getImag()*c2.getReal()-c1.getReal()*c2.getImag())/(c2.getReal()*c2.getReal()+c2.getImag()*c2.getImag());
        //相乘后的复数
        return new Complex(r,i);
    }
    /**
     *
     * @param o
     * @return  比较两个复数是否相同
     */
    @Override
    public boolean equals(Object o) {
        if (this == o) return true;
        if (o == null || getClass() != o.getClass()) return false;
        Complex complex = (Complex) o;
        return Double.compare(complex.real, real) == 0 &&
                Double.compare(complex.imag, imag) == 0;
    }
    @Override
    public int hashCode() {
        return Objects.hash(real, imag);
    }
    /**
     *
     * @return 打印展示复数
     */
    @Override
    public String toString() {
       StringBuilder sb=new StringBuilder();
       //保留四位小数,并且去0.
       String tempR=new BigDecimal(this.real).
               setScale(4, BigDecimal.ROUND_HALF_UP).stripTrailingZeros().toString();
       sb.append(tempR);
        //如果虚部为正,需要添加一个+号。 为-时,不需要添加
        if(this.imag>0){
            sb.append("+");
        }
        //如果为0,返回实部
        if(this.imag==0){
            return sb.toString();
        }
       //添加虚部, 复数后面的 i是固定的
        String tempI=new BigDecimal(this.imag).
                setScale(4, BigDecimal.ROUND_HALF_UP).stripTrailingZeros().toString();
        sb.append(tempI);
        sb.append("i");
       return sb.toString();
    }
    /**
     *
     * @return 返回实部
     */
    public double getReal() {
        return real;
    }
    /**
     * 设置实部
     * @param real
     */
    public void setReal(double real) {
        this.real = real;
    }
    /**
     *
     * @return 返回虚部
     */
    public double getImag() {
        return imag;
    }
    /**
     *
     * @param imag 设置虚部
     */
    public void setImag(double imag) {
        this.imag = imag;
    }
}


二.二 测试


package com.yjl.collection;
/**
 * package: com.yjl.collection
 * className: ComplexTest
 * Description: 请输入相应的描述
 *
 * @author : yuezl
 * @Date :2020/6/11 8:12
 */
public class ComplexTest {
    public static void main(String[] args) {
        //1. 第一个复数, 实部为2,虚部为7
        Complex c1=new Complex(2,7);
        //2. 第二个复数, 实部为3,虚部为-6
        Complex c2=new Complex(3,-6);
        //3. 第三个复数,实部为2,虚部为-7.
        Complex c3=new Complex(2,-7);
        //4. 第四个复数,看是否相同
        Complex c4=new Complex(2,7);
        System.out.println("c1打印输出:"+c1.toString());
        System.out.println(c1.toString()+"+"+c2.toString()+"="+Complex.add(c1,c2));
        System.out.println(c1.toString()+"-"+c2.toString()+"="+Complex.substract(c1,c2));
        System.out.println(c1.toString()+"*"+c2.toString()+"="+Complex.multiply(c1,c2));
        System.out.println(c1.toString()+"/"+c2.toString()+"="+Complex.divide(c1,c2));
        System.out.println(c3.toString()+"的大小模为:"+c1.magnitude());
        System.out.println(c3.toString()+"是否为纯虚函数:"+c1.pure());
        System.out.println(c1.toString()+"与"+c3.toString()+"是否为共轭复数:"+c1.conjugate(c3));
        System.out.println(c1.toString()+"与"+c4.toString()+"是否相同:"+c1.equals(c4));
    }
}


运行程序,控制台打印输出:


20200611090539630.png


谢谢您的观看,如果喜欢,请关注我,再次感谢 !!!

相关文章
|
1月前
|
Java
【java作业3——类的定义】复数,连续子数组,最大素数
🍒 1 定义复数类 作业内容: 定义一个复数类Complex(数据成员:a,b表示复数a+bi).并配以合适的方法完成复数对象的生成、复数的运算(加、减、乘除),然后做一个主类测试它。
34 0
|
Java
Java 实现汉字按照首字母分组排序
Java 实现汉字按照首字母分组排序
604 0
|
分布式计算 Java Hadoop
Java实现单词计数MapReduce
本文分享实现单词计数MapReduce的方法
311 0
|
Java 数据安全/隐私保护
JAVA 实现上传图片添加水印(详细版)(上)
JAVA 实现上传图片添加水印(详细版)
1022 0
JAVA 实现上传图片添加水印(详细版)(上)
|
存储 Java
Java实现图书管理系统
本篇文章是对目前Java专栏已有内容的一个总结练习,希望各位小主们在学习完面向对象的知识后,可以阅览本篇文章后,自己也动手实现一个这样的demo来加深总结应用已经学到知识并进行巩固。
380 0
Java实现图书管理系统
|
Java Windows Spring
java实现spring boot项目启动时,重启Windows进程
java实现spring boot项目启动时,重启Windows进程
481 0
|
数据可视化 Java
Java实现拼图小游戏(1)—— JFrame的认识及界面搭建
如果要在某一个界面里面添加功能的话,都在一个类中,会显得代码难以阅读,而且修改起来也会很困难,所以我们将游戏主界面、登录界面、以及注册界面都单独编成一个类,每一个类都继承JFrame父类,并且在类中创建方法来来实现页面
495 0
Java实现拼图小游戏(1)—— JFrame的认识及界面搭建
|
网络协议 Java
Java网络编程:UDP/TCP实现实时聊天、上传图片、下载资源等
ip地址的分类: 1、ipv4、ipv6 127.0.0.1:4个字节组成,0-255,42亿;30亿都在北美,亚洲就只有4亿 2011年就用尽了。
Java网络编程:UDP/TCP实现实时聊天、上传图片、下载资源等
|
数据可视化 Java 容器
Java实现拼图小游戏(7)—— 计步功能及菜单业务的实现
注意由于我们计步功能的步数要在重写方法中用到,所以不能将初始化语句写在方法体内,而是要写在成员位置。在其名字的时候也要做到“见名知意”,所以我们给它起名字为step
286 0
Java实现拼图小游戏(7)—— 计步功能及菜单业务的实现
|
Java
Java实现拼图小游戏(7)—— 作弊码和判断胜利
当我们好不容易把拼图复原了,但是一点提示也没有,完全看不出来是成功了,那么我们就需要有判断胜利的功能去弹出“成功”类的图片,以便于玩家选择是重新开始还是退出小游戏
254 0
Java实现拼图小游戏(7)—— 作弊码和判断胜利