zoukankan      html  css  js  c++  java
  • [LeetCode] 537. Complex Number Multiplication

    题目比较简单,实现一个复数乘法,输入输出都要求为字符串形式

    Input: "1+1i", "1+1i"
    Output: "0+2i"
    Explanation: (1 + i) * (1 + i) = 1 + i2 + 2 * i = 2i, and you need convert it to the form of 0+2i.
    

    大部分时间都花在写正则匹配实部和虚部了

    两个复数
    (a + bi), (c + di)

    ((a + bi) * (c + di) = (ac - bd) + (bc + ad)i)

    使用三个辅助变量

    [egin{cases} t_1 = (a - b) * (c + d) \ t_2 = a * d \ t_3 = b * c \ end{cases},]

    ((a + bi) * (c + di) = (t_1 - t_2 + t_3) + (t_2 + t_3)i)

    这样可以把四次乘法减少到三次

    string complexNumberMultiply(string a, string b) {
            regex complex_regex("(.*?)\+(.*?)i");
            
            int a_real = 0;
            int a_imaginary = 0;
            
            int b_real = 0;
            int b_imaginary = 0;
            
            smatch a_complex_match;
            if (std::regex_search(a, a_complex_match, complex_regex))
            {
                a_real = stoi(a_complex_match[1]);
                a_imaginary  = stoi(a_complex_match[2]);
            }
            
            smatch b_complex_match;
            if (std::regex_search(b, b_complex_match, complex_regex))
            {
                b_real = stoi(b_complex_match[1]);
                b_imaginary  = stoi(b_complex_match[2]);
            }
            
            int t1 = (a_real - a_imaginary) * (b_real + b_imaginary);
            int t2 = (a_real * b_imaginary);
            int t3 = (a_imaginary * b_real);
            
            return to_string(t1 - t2 + t3) + "+" + to_string(t2 + t3) + "i";
        }
    

    再看看leetcode上其他人写的代码

    用stringstream来读取实部和虚部

    -1+-2i

    -1 + -2 +
    int char int char

    aa >> ra >> buff >> ia >> buff

    string complexNumberMultiply(string a, string b) {
            stringstream aa(a), bb(b), ans;
            int ra, ia, rb, ib;
            char buff;
            aa >> ra >> buff >> ia >> buff;
            bb >> rb >> buff >> ib >> buff;
            ans << ra * rb - ia * ib <<"+" << ra * ib + rb * ia << "i";
            return ans.str();
        }
    

    参照这份代码对我的代码做一些修改,去掉正则部分,改用stringstream, 最终代码如下

    string complexNumberMultiply(string a, string b) 
    {
        int a_real, a_imaginary = 0;
        int b_real, b_imaginary = 0;
        char buff;
    
        stringstream ss_a(a);
        stringstream ss_b(b);
        ss_a >> a_real >> buff >> a_imaginary;
        ss_b >> b_real >> buff >> b_imaginary;
    
        int t1 = (a_real - a_imaginary) * (b_real + b_imaginary);
        int t2 = (a_real * b_imaginary);
        int t3 = (a_imaginary * b_real);
    
        return to_string(t1 - t2 + t3) + "+" + to_string(t2 + t3) + "i";
    }
    
  • 相关阅读:
    微信开发之获取用户信息
    tomcat支持php
    myecplise自带的tomcat问题
    php项目报错 Warning: session_start(): open(D:/software/wamp/wamp/tmpsess_msrjot7f32ciqb1p2hr4ahejg4, O_RDWR) f
    magento获取商品的图片
    python链接mysql
    cordova,可以尝试下!
    小程序来了
    App开发需要了解的基本技术
    web APP到底和跨平台APP开发有什么区别?
  • 原文地址:https://www.cnblogs.com/arcsinw/p/9342799.html
Copyright © 2011-2022 走看看