分治算法--求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

posted @ 2020-11-02 18:43  哈哈不是嘎嘎  阅读(698)  评论(0编辑  收藏  举报