第三十八天
我使用的C++,错误的地方请见谅,文章初衷仅用来督促本人学习,如果恰巧能够给你带来帮助,我会十分开心。
文章目录
- 第三十八天
- 一、537. 复数乘法
- 二、29. 两数相除
一、537. 复数乘法
复数 可以用字符串表示,遵循 “实部+虚部i” 的形式,并满足下述条件:
实部 是一个整数,取值范围是 [-100, 100]
虚部 也是一个整数,取值范围是 [-100, 100]
i2 == -1
给你两个字符串表示的复数 num1 和 num2 ,请你遵循复数表示形式,返回表示它们乘积的字符串。
来源:力扣(LeetCode)
链接:https://leetcode.cn/problems/complex-number-multiplication
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
class Solution {
public:
string complexNumberMultiply(string num1, string num2) {//实部相乘虚部相乘
string ans = "";
int i = num1.find('+'), j = num2.find('+');//分别找到两个+的位置
int a = stoi(num1.substr(0, i));//将第一个实部提取
int b = stoi(num1.substr(i + 1, num1.size() - i - 1));//将第一个虚部提取
int c = stoi(num2.substr(0, j));
int d = stoi(num2.substr(j + 1, num2.size() - j - 1));
ans += to_string(a * c - b * d);//转为字符串
ans += "+";
ans += to_string(a * d + c * b);
ans += "i";
return ans;
}
};
虚数乘法法则
str相关函数的用法
二、29. 两数相除
给定两个整数,被除数 dividend 和除数 divisor。将两数相除,要求不使用乘法、除法和 mod 运算符。
返回被除数 dividend 除以除数 divisor 得到的商。
整数除法的结果应当截去(truncate)其小数部分,例如:truncate(8.345) = 8 以及 truncate(-2.7335) = -2
来源:力扣(LeetCode)
链接:https://leetcode.cn/problems/divide-two-integers
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
class Solution {
public:
int divide(int dividend, int divisor) {
int sign = ((((dividend ^ divisor) >> 31) & 0x01) == 1) ? -1 : 1;//判断符号
long result = 0;
long dividend_long = abs((long)dividend);//换为长整型避免溢出
long divisor_long = abs((long)divisor);
/* while(dividend_long >= divisor_long){//循环减去除数
dividend_long -= divisor_long;
result++;
}*/
while(dividend_long >= divisor_long){//类二分法
long i = 1;
long tmp = divisor_long;
while(dividend_long >= tmp){//在能够除的情况下,除数乘成指数增长
dividend_long -= tmp;
result += i;
i = i << 1;//i * 2
tmp = tmp << 1;
}
}
result *= sign;
if(result > INT_MAX || result < INT_MIN){
return INT_MAX;
}
return (int)result;
}
};
在不使用既定除法的原则下,就是使用被减数不断减去除数的方法去实现,简单的方案是每次减去一个除数,进阶就是除数成指数增长,这样时间复杂度可以达到O(logN);