數值得整數次方--模擬pow函式的功能

gogogo_sky發表於2017-05-11

1.數值得整數次方

(1)當底數等於0且指數為負數時,錯誤;
(2)當底數任意,指數分為大於等於0,和小於0
1)指數>=0 ,直接求值;
2)指數<0,先給指數取絕對值,然後按照指數為正求值,最後給結果求倒數

程式碼:

#include<iostream>
using namespace std;
double fun(double bash,unsigned int tmp);
bool Zero(double bash,double num);
double Power(double bash,int exponent)
{
    if (Zero(bash,0.0)&&(exponent<0))//當底數等於0且指數為負數時,錯誤;
    {
        printf("erro\n");
        exit(EXIT_FAILURE);
    }
    unsigned int tmp=(unsigned int)exponent;//tmp用於儲存變為正數的次數
    if (exponent<0)
    {
        tmp=(unsigned int)(-exponent);
    }
    double ret=fun(bash,tmp);//無論次數正負,統一用正次數求結果
    if (exponent<0)//當次數時小於0的情況,返回結果的倒數
    {
        ret=1.0/ret;
    }
    return ret;//當次數時大於或者等於0的情況,直接返回結果
}
double fun(double bash,unsigned int tmp)//求次冪的值
{
     double ret=1;
     for (unsigned i=1;i<=tmp;i++)
     {
         ret*=bash;
     }
     return ret;
}
bool Zero(double bash,double num)//判斷底數是否等於0
{
   if ((bash-num>-0.0000001)&&(bash-num<0.0000001))
   {
       return true;
   }
   return false;
}

int main()
{  
    //當底數>=0
    cout<<Power(2.0,3)<<endl;
    cout<<Power(2.0,-3)<<endl;
    cout<<Power(0.0,3)<<endl;
    //當底數<0
    cout<<Power(-2.0,3)<<endl;
    cout<<Power(-2.0,-3)<<endl;
    //當底數<0&&次數<0
    cout<<Power(0,-3)<<endl;
    return 0;
}

執行結果:
這裡寫圖片描述

2.求一個底數次冪值得優化

優化:上面的 求次冪的值需要迴圈次數 次,才可以求出該數的次方的值;
其實可以2倍的求:
a^n=a^(n/2)*a^(n/2)—n為偶數
a^n=a^(n/2)*a^(n/2)*a—-n為基數

double fun(double bash,unsigned int tmp)//求次冪的值
{
    //特殊情況處理
    if (tmp==0)
    {
        return 1;
    }
    if (tmp==1)
    {
        return bash;
    }

    //常規公式
    double ret=fun(bash,tmp/2);//求a^(n/2)
    ret*=ret;//次數為偶數,a^n=a^(n/2)*a^(n/2)
    if (tmp%2!=0)//次數為奇數,在偶數的處理上在乘一次底數
    {
        ret=ret*bash;//a^n=a^(n/2)*a^(n/2)*a
    }
   return ret;//返回結果;
}


相關文章