乘方加减乘法多重加法立式乘法(最佳化)龟速乘方除法(最佳化)乘方操作(高速乘方) ) ) )。
加号
3358 www.Sina.com/http://www.Sina.com/http://www.Sina.com/http://www.Sina.com /
题目链接
3358 www.Sina.com/http://www.Sina.com/http://www.Sina.com/http://www.Sina.com /
类解决方案{ public : stringaddstrings (string num 1,string num2) { string s1; int add=0,size1=num1.length(-1,size2=num2.length )-1; wile(size1=0||size2=0||add!=0(intx=size1=0? num1[size1]-'0':0; int y=size2=0? num2[size2]-'0':0; int sum=x y add; S1.push_back('0'sum ); add=sum/10; size1--; size2--; }反向(S1.begin )、s1.end ); 返回S1; };题目描述:
给定两个字符串形式的非负整数 num1 和num2 ,计算它们的和并同样以字符串形式返回。
乘坐3358 www.Sina.com/http://www.Sina.com/http://www.Sina.com/3358 www.Sina.com/3358
加法http://www.Sina.com/http://www.Sina.com /
3358 www.Sina.com/http://www.Sina.com/http://www.Sina.com /
类解决方案{ public : stringaddstrings (string num 1,string num2) { string s1; int add=0,size1=num1.length(-1,size2=num2.length )-1; wile(size1=0||size2=0||add!=0(intx=size1=0? num1[size1]-'0':0; int y=size2=0? num2[size2]-'0':0; int sum=x y add; S1.push_back('0'sum ); add=sum/10; size1--; size2--; }反向(S1.begin )、s1.end ); 返回S1; }stringmultiply(stringnum1,string num2) if ) num1=='0'||num2=='0' ) { return '0'; } else { int c
arry=0,i1=num1.size()-1,i2=num2.size()-1; string sum=""; for(int i=num2.size()-1;i>=0;--i) { string ret; i1 = num1.size() - 1; while(i1>=0||carry!=0) { int x=i1>=0?num1[i1]-'0':0; int y=(num2[i]-'0'); int multi=x*y+carry; ret.push_back((multi%10)+'0'); carry=multi/10; i1--; } reverse(ret.begin(),ret.end());//注意这里不是.end()-1 int count=num2.size()-1-i;//计数添几个0 while(count--) { ret.push_back('0'); } sum=addStrings(ret,sum); } return sum; } }}; 竖式乘法(优化)思路:
做乘法,由于两数相乘必为位数m+n或m+n-1,创建一个m+n大小的数组来存储,提高效率通过两数相乘时,乘数某位与被乘数某位相乘,与产生结果的位置的规律来完成
代码如下:
使用场景: 爆long long的时候比如两个long long相乘再取模a×b超过long long能表示的范围(a×b%c)
思路如下: 类似快速幂(二进制位)
代码如下:
题目链接
题目描述:
实现 pow(x, n) ,即计算 x 的 n 次幂函数(即,xn),要求时间复杂度小于O(n)
思路一:从二进制的角度---迭代(时间复杂度O(logn) 空间复杂度O(1))
( 例子: 求pow(x,77) )
代码如下:
注意:
思路二:从分治的角度---递归(时间复杂度O(logn) 空间复杂度O(logn))
我们可以这样(除2向下取整):77/2=38,38/2=19,19/2=9,9/2=4,4/2=2,2/2=1指数每次乘以2
x1 ——> x2 ——> x4 —+1—> x9 — +1—> x19 ——> x38 —+1—> x77分为两种情况:奇数和偶数,奇数/2就多出一个x,偶数就不用用递归,每次指数会减少一半
代码如下(leetcode 官方解法一):
class Solution {public: double quickMul(double x, long long N) { if (N == 0) { return 1.0; } double y = quickMul(x, N / 2); return N % 2 == 0 ? y * y : y * y * x; } double myPow(double x, int n) { long long N = n; return N >= 0 ? quickMul(x, N) : 1.0 / quickMul(x, -N); }};作者:LeetCode-Solution链接:https://leetcode-cn.com/problems/powx-n/solution/powx-n-by-leetcode-solution/来源:力扣(LeetCode)著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。