欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

Java实现复数(二十一)

程序员文章站 2024-03-22 13:39:22
...

勿以恶小而为之,勿以善小而不为--------------------------刘备

劝诸君,多行善事积福报,莫作恶

上一章简单介绍了 矩阵的加法,减法,乘法和转置(二十),如果没有看过,请观看上一章

一. 复数

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

把运算法则 复制一下:

Java实现复数(二十一)

复数有两个属性, 实部 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));

    }
}

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

Java实现复数(二十一)

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