分治算法--求m的n次方
分治算法技巧和原理: https://blog.csdn.net/weixin_44489823/article/details/92799755
这里假设m可以是个超大数, n也可以是个超大数。 所以用上 https://www.cnblogs.com/silentNight/p/13910510.html 里面的超大数相乘函数
m的n次方: 如果n是偶数可以拆成 m的(n/2)次方乘以 m的(n/2)次方 ; 如果n是奇数可以拆成 m的([n-1]/2)次方乘以 m的([n-1]/2)次方 再乘以多出的那个m. 代码如下:
vector<int> calPow(vector<int> val, int pow) { cout << "pow = " << pow <<endl; if (pow == 2) { vector<int> result = mulVec(val, val); cout<<"result="; showV(result); cout<<endl; return result; } if (pow == 1) { return val; } /*分治算法*/ //如果次方是偶数,比如2的4次方那么可以拆成2平方 * 2平方 if (pow%2 == 0) { return mulVec( calPow(val,pow/2), calPow(val,pow/2)); } //如果次方是奇数,比如2的5次方那么可以拆成2平方 * 2平方 * 2 return mulVec( mulVec(calPow(val,(pow-1)/2), calPow(val,(pow-1)/2)), val ); } void test_calMyPow() { vector<int> val; val.push_back(3); val.push_back(3); val.push_back(3); int pow = 19; vector<int> result = calPow(val, pow); cout << "finalResult ="; showV(result); cout<<endl; }
分支算法的时间复杂度: https://blog.csdn.net/cutter_point/article/details/41172467