2014-03-29 131 views
2

編譯完下面的程序後,我得到輸出「2346」,但期待「2345」。函數pow如何工作?

#include<math.h> 
#include<iostream.h> 
int nr_cif(int a) 
{ 
    int k=0; 
    while(a!=0) 
    { 
     a = a/10; 
     k++; 
    } 
    return k; 
} 

void Nr(int &a){ 
    int k = nr_cif(a); 
    a = a % (int)pow(10,k-1); 
} 


int main() 
{ 
    int a = 12345; 
    Nr(a); 
    cout<<a; 
} 

調試之後,我注意到它蟲子它評估後: A = A%(INT)POW(10,K-1)。它爲什麼在這裏突破?

+2

使用'',不''。 ''也會比''好一點。 – chris

回答

1

對整數運算使用pow並不是一個好主意。我會更改代碼,如下所示:

void Nr(int &a) 
{ 
    int ten_k = 1; 
    while (ten_k < a) ten_k *= 10; 
    a %= ten_k/10; // 10-to-the-(k-1) 
} 

代碼中沒有任何內容需要小數位數,只有位置值。所以讓這個地方值你的變量。 (你也可以使用你原來的while循環,這對於負輸入來說效果更好,但是計算並返回10-k-power,而不是k)。

pow的問題在於它與浮點值一起工作,並給出非常接近但不精確的結果。該錯誤可能足以導致取整值(在投射到int後)出錯。你可以在轉換之前通過添加0.5來解決這個問題......但沒有意義,因爲循環中的乘法比調用pow快。

+0

感謝您的評論,但我不認爲它適用於此代碼。例如,如果我們取a = 12,它將通過while循環兩次,因此ten_k將最終爲100.然後'a'不會改變它的值。我想要它刪除它的第一個數字 – user3461699

+0

@ user3461699:好的,你是對的。使用'a%(ten_k/10)' –

0

我不驚人或大的數學,但這似乎工作:http://ideone.com/dFsODB

#include <iostream> 
#include <cmath> 

float mypow(float value, int pow) 
{ 
    float temp = value; 
    for (int i = 0; i < pow - 1; ++i) 
     temp *= value; 

    for (int i = 0; i > pow - 1; --i) 
     temp /= value; 

    return temp; 
} 


int main() 
{ 
    std::cout<<pow(10, -3)<<"\n"; 
    std::cout<<mypow(10, -3)<<"\n"; 
    return 0; 
}