2017-03-06 87 views
-3

在製作數學應用程序時,我需要計算已知爲完美n次方的數字的第n個根。但爲了找到第n個根,我使用了下面的代碼查找數字的第n個根的函數

int i, j, set; 
for (i = 1; i <= number; i++) 
{ 
    j = pow(i, exponent); 
    if (j == number) 
    { 
     set == i; 
     return set; 
    } 
} 

在函數Root(int number,int exponent)中。

現在要得到答案我需要捕獲'我'的時刻'j ==數字'發生的價值,我需要返回'我'這個值作爲返回值,以便我可以使用它。 它可以工作,但對於某些值,如25,100等,它給垃圾值作爲答案。什麼應該是這個程序的正確編碼?

+0

A [MCVE],請。 – StoryTeller

+0

需要更多代碼。考慮在這裏發佈最小但完整的代碼。 –

回答

2

j = round(pow(i, e))會更加穩定;如果它們恰好處於錯誤的方向,則將浮點截斷到下一個較低的整數會誇大一些微小的錯誤。

但你可能可以做用逆指數估算的根本好轉:

int root = round(pow(number, 1.0/e)); 

然後,只需檢查roote功率number

+0

這太棒了!謝謝 :) –

2

你有一個錯字

set == i 

probablye應該

set = i 

不要忽視編譯器警告,如果你沒有他們激活它們。另外,嘗試使用最新的編譯器,以獲得最新的診斷能力。

+0

當然!我在我的代碼中修復了這個問題 –

3

這是因爲set未初始化,即您從未設置它。你這樣做:

set==i; 
return set; 

這是比較seti(這什麼都不做)。然後你將它返回未初始化。做

return i; 

因爲你不用set的東西無論如何。

+0

直接使用「return i」也給出了不可預知的值 –

0

功能pow對於功率取參數double,對於第n個根將是1.0/n

該程序然後使用包含結果的值的整數算術來查看它們是否正確啓動。沒有必要進行徹底的循環。

程序運行參數是numbern-th root

#include <stdio.h> 
#include <math.h> 

unsigned powN (unsigned num, unsigned power) 
{ 
    unsigned prod = 1; 
    while (power) { 
     if (power & 1) 
      prod *= num; 
     num *= num; 
     power >>= 1; 
    } 
    return prod; 
} 

int main(int argc, char *argv[]) 
{ 
    unsigned number, root, answer, test; 

    if(argc < 3) { 
     return 0; 
    } 
    if(sscanf(argv[1], "%u", &number) != 1) { 
     return 0; 
    } 
    if(sscanf(argv[2], "%u", &root) != 1) { 
     return 0; 
    } 

    answer = (unsigned)pow(number, 1.0/root); 

    // check this value 
    test = powN(answer, root); 
    if(test == number) { 
     printf("%u**%u = %u\n", answer, root, number); 
     return 0; 
    } 

    // check the value above 
    test = powN(answer+1, root); 
    if(test == number) { 
     printf("%u**%u = %u\n", answer+1, root, number); 
     return 0; 
    } 

    // check the value below 
    if (answer > 1) { 
     test = powN(answer-1, root); 
     if(test == number) { 
      printf("The %u**%u = %u\n", answer-1, root, number); 
      return 0; 
     } 
    } 

    printf("No exact %u-th root of %u\n", root, number); 
    return 0; 
} 

樣品試驗:

 
test 49 2 
7**2 = 49 

test 50 4 
No exact 4-th root of 50 

test 64 3 
4**3 = 64 

test 16807 5 
7**5 = 16807