PAT (Basic Level) Practice (中文)1051 复数乘法 (15 分)(Java实现)

题目描述:

复数可以写成 ( A + B i ) (A+Bi) (A+Bi)的常规形式,其中 A A A 是实部, B B B 是虚部, i i i 是虚数单位,满足 i 2 ​ ​ = − 1 i^2​​ =−1 i2=1;也可以写成极坐标下的指数形式 ( R × e ​ ( P i ) ​ ​ ) (R×e^{​(Pi)}​​) (R×e(Pi)),其中 R 是复数模,P 是辐角,i 是虚数单位,其等价于三角形式 ( R ( c o s ( P ) + i s i n ( P ) ) (R(cos(P)+isin(P)) (R(cos(P)+isin(P))

现给定两个复数的 R 和 P,要求输出两数乘积的常规形式。

输入格式:

输入在一行中依次给出两个复数的 R 1 , P 1 , R 2 , P 2 ​ ​ R_1, P_1, R_2, P_2 ​​ R1,P1,R2,P2,数字间以空格分隔。

输出格式:

在一行中按照 A+Bi 的格式输出两数乘积的常规形式,实部和虚部均保留 2 位小数。注意:如果 B 是负数,则应该写成 A-|B|i 的形式。

输入样例:

2.3 3.5 5.2 0.4

输出样例:

-8.68-8.23i

代码示例(Java实现)

import java.util.Scanner;

public class Main {

    public static void main(String[] args) {

        Scanner cin = new Scanner(System.in);

        double a0 = cin.nextDouble();
        double b0 = cin.nextDouble();
        double c0 = cin.nextDouble();
        double d0 = cin.nextDouble();

        double a = a0 * Math.cos(b0);
        double b = a0 * Math.sin(b0);
        double c = c0 * Math.cos(d0);
        double d = c0 * Math.sin(d0);

        double i = (a * c - b * d);
        double j = (a * d + b * c);

        /**
         * 处理计算结果的时候有一点小坑,
         * 对于实部来说:如果处理小数点后的结果为:-0.00 需要转化为 0.00
         * 对于虚部来说:如果处理小数点后的结果为:-0.00i 需要转化为 +0.00i
         * 其实这个转化我是有点疑问的,因为实际上的计算结果的符号本身就是 负数,
         * 是比 0 小的,结果这样一转化,他就不是负数了,
         * 不过只看满五进一的话,又可以理解了。
         * 嘻嘻
         */
        String result = String.format("%.2f", i);
        if ("-0.00".equals(result)) {
            result = "0.00";
        }
        
        String result1 =  j >= 0 ? (String.format("+%.2fi", j)) : (String.format("%.2fi", j));
        if ("-0.00i".equals(result1)) {
            result1 = "+0.00i";
        }
        System.out.println(result + result1);
    }

}

你可能感兴趣的:(数据结构与算法,Ĵava,算法题,PAT)