537. 复数乘法
复数
可以用字符串表示,遵循 实部+虚部i"
的形式,并满足下述条件:
实部
是一个整数,取值范围是 [-100, 100]虚部
也是一个整数,取值范围是 [-100, 100]- i2 == -1
- 给你两个字符串表示的复数
num1
和num2
,请你遵循复数表示形式,返回表示它们乘积的字符串。
示例 1:
输入:num1 = "1+1i", num2 = "1+1i"
输出:"0+2i"
解释:(1 + i) * (1 + i) = 1 + i2 + 2 * i = 2i ,你需要将它转换为 0+2i 的形式。
示例 2:
输入:num1 = "1+-1i", num2 = "1+-1i"
输出:"0+-2i"
解释:(1 - i) * (1 - i) = 1 + i2 - 2 * i = -2i ,你需要将它转换为 0+-2i 的形式。
提示:
num1
和num2
都是有效的复数表示。
题目分析:
第一次看到题目的时候,想到会很麻烦,但是字符串截取函数记不太清楚,字符转成数字的函数也忘了,所以一来二去就想到了暴力,所有的实现都通过代码去实现,而没有调用函数,导致代码又臭又长
题目的思路很简单,就是复数相乘,可以把它看成两个一元一次方程求解,对应系数相乘,然后得出最终表达式,那么麻烦就麻烦在如何在一串字符中提取数字
方法一:暴力
class Solution {
public:
string complexNumberMultiply(string num1, string num2) {
int n=num1.size(),m=num2.size();
int a=0,b=0,c=0,d=0;//找出四个数字
int flag1=0,flag2=0;//标记一下,方便找出同一段字符串的两个数字
int ans1=1,ans2=1;//标记符号,看看是负数还是正数
int cnt1=0,cnt2=0;
char sss[100000];
for(int i=0;i<n;++i){
if(num1[i]>='0'&&num1[i]<='9'&&flag1==0){
//找第一个数
a=a*10+(num1[i]-'0');
}
else{
if(i!=0){
//找第二个数
if(num1[i]=='-'||num1[i]=='+'&&num1[i+1]=='-')//判断第二个数是正数还是负数
ans1=-1;
flag1=1;
if(num1[i]>='0'&&num1[i]<='9'){
//找第二个数
b=b*10+(num1[i]-'0');
}
}
}
}
if(num1[0]=='-')//如果第一字符为-,那么就是复数
a=-a;
b*=ans1;//这里就是看ans1的状态,如果不出现负号,那么ans1就不会变化,反之
for(int i=0;i<m;++i