2013-11-09 22 views
1

我有一個程序必須在一個區間內打印所有整數的完美平方根。現在我想爲n - 根做到這一點。在一個區間內找到所有數字的第n個根

這是我所做的,但我卡在fmod。

#include <iostream> 
#include <math.h> 
using namespace std; 

int nroot(int, int); 

int main() 
{ 

    int p, min, max,i; 
    double q; 

    cout << "enter min and max of the interval \n"; 
    cin >> min; 
    cin >> max; 
    cout << "\n Enter the n-th root \n"; 
    cin >> p; 
    i = min; 

    while (i <= max) 
    { 
     if (fmod((nroot(i, p)), 1.0) == 0) 
     { 
      cout << nroot(i, p); 
     } 
     i++; 
    } 
    return 0; 
} 

int nroot (int i, int p){ 

    float q; 
    q = (pow(i, (1.0/p))); 

    return q; 
} 
+1

你是什麼意思,你卡在fmod? – Jerska

+0

我的意思是我想用fmod作爲%10來比較nroot()。就像測試一個數字是否是偶數一樣。 – Daniel

回答

2

您可能想要在相反的方向解決這個問題。而不是採取的每一個值的n次方根的間隔,以查看是否第n根是一個整數,而不是採取的間隔的邊界的n次方根,和步驟在根部的術語:

// Assume 'min' and 'max' set as above in your original program. 
// Assume 'p' holds which root we're taking (ie. p = 3 means cube root) 
int min_root = int(floor(pow(min, 1./p))); 
int max_root = int(ceil (pow(max, 1./p))); 

for (int root = min_root; root <= max_root; root++) 
{ 
    int raised = int(pow(root, p)); 
    if (raised >= min && raised <= max) 
     cout << root << endl; 
} 

for循環內部的額外測試是處理minmax直接位於根上或僅位於根側的情況。

您可以通過識別raised僅在循環的邊界處需要,從循環中刪除測試和計算。這個版本,而稍微複雜一點看,實現了觀察:

// Assume 'min' and 'max' set as above in your original program. 
// Assume 'p' holds which root we're taking (ie. p = 3 means cube root) 
int min_root = int(floor(pow(min, 1./p))); 
int max_root = int(ceil (pow(max, 1./p))); 

if (int(pow(min_root, p)) < min) 
    min_root++; 

if (int(pow(max_root, p)) > max) 
    max_root--; 

for (int root = min_root; root <= max_root; root++) 
    cout << root << endl; 

如果你真的關心性能(我懷疑你是不是在這種情況下),你可以用代碼替換int(pow(..., p)),計算第n權力完全與整數算術。儘管如此,這似乎是過度殺傷力。

+0

偉大的ideea。它只使用整數。謝謝。 – Daniel

1

浮點數的精確相等測試可能無法按預期工作。這是更好地與一些小的數進行比較:

float t = nroot(i, p); 
if (fabs(t - rintf(t)) <= 0.00000001) 
{ 
    cout << t << endl; 
} 

即使在這種情況下,你都不能保證獲得最小值,最大值和p的所有值正確的結果。所有這一切取決於您代表數字的這個小數字和精度。你可能會考慮更長的浮動類型,比如「double」和「long double」。

+0

這是一個很好的一般觀點,不能做足夠多的時間。它似乎絆倒了所有使用浮點運算的人。在我上面的例子中,我重寫了這個問題以完全避免浮點相等比較,出於類似的原因:浮點相等比較太臭了。 –