2012-09-19 57 views
0

我有一個家庭作業,因爲我的循環出了問題。我首先必須通過我已經可以做的循環找到下一個最高和最低的平方根。接下來,我的任務告訴我,我需要通過對整數的下一個最高和最低平方根進行平均來獲得平方根的近似值。然後我必須向用戶詢問他們想要的精確度的小數位數。這是來自作業的報價:在C++中通過迭代找到平方根

然後應該構建一個計數控制循環;它會爲每個所需的小數位執行一次;在這個例子中,這個循環將執行四次(每一次爲十分之一,百分之一,千分之一和十分之一小數位)。使用諸如decimalPosition之類的計數器來跟蹤循環打開的路徑。

這是我遇到麻煩的地方,我基於用戶輸入的小數位數來使用while循環,但是我的循環沒有完成循環。我是編程新手,所以如果這真的很簡單,請原諒我。這裏是我的,而代號:

for (int decimalPosition = 1; decimalPosition <= decimal; decimalPosition++) 
{ 
    while (baseRoot*baseRoot > num) 
    { 
     baseRoot = baseRoot - (pow((.1),decimalPosition)); 
     cout << fixed << setprecision(decimal) << baseRoot << endl; 
    } 

} 

這裏是我的輸出到目前爲止

Enter a number you wish to know the square root of: 8 
Enter the number of decimal places of accuracy you want: 7 
Find the square root of 8 to 7 decimal places: 
2.6000000 
2.7000000 
2.8000000 
2.9000000 
2.9000000 square root of 8.0000000 
+0

你能粘貼輸出嗎? –

+0

你可以刪除作業標籤 - 它已被棄用 –

+0

@AdrianCornish認爲它現在消失了,我現在無法看到它:) –

回答

4

這就是所謂的Newton's method,其收斂是二次。這應該有助於你弄明白。

PS - 巴比倫人首先發現了它,但牛頓因此而得名。

+6

不要讓我開始對巴比倫人。 –

+0

http://en.wikipedia.org/wiki/Babylonian_method#Babylonian_method – TemplateRex

+0

我得到了正確的數學。我發現我錯誤地實現了我的循環。我的計數控制循環未正確初始化。現在我的代碼神奇地通過這種方法找到平方根。這非常漂亮! – faustborne

0

爲了使您的工作循環,可以在while循環後添加一條語句

baseRoot = baseRoot + (pow((.1),decimalPosition)); 

,因爲你需要確保baseRoot比每次迭代之前的答案更大。像這樣:

for (int decimalPosition = 1; decimalPosition <= decimal; decimalPosition++) 
{ 
    while (baseRoot*baseRoot > num) 
    { 
     baseRoot = baseRoot - (pow((.1),decimalPosition)); 
     cout << fixed << setprecision(decimal) << baseRoot << endl; 
    } 
    baseRoot = baseRoot + (pow((.1),decimalPosition)); 
} 

現在你可以得到答案2.8284271

順便提一下,還有另一種稱爲二分法有效的方式(類似二進制搜索),沒有太多的數學來解決這類問題(有關單調函數):

double mySqrt(double x, double epsilon) { 
    double left = 0, right = x; 
    while (right - left > epsilon) { 
     double mid = (left + right)/2; 
     if (mid * mid > x) { 
      right = mid; 
     } else { 
      left = mid; 
     } 
    } 
    return left; 
} 

這是簡單,愚蠢:)