2012-01-21 132 views
0

我應該編寫一個Java程序來總結下列順序:1.0/1.0 + 1.0/2.0 + 1.0/3.0 .... + 1.0/15,000,000.0以遞增順序然後再次以遞減順序從1.0/15,000,000.0 + 1.0/14,999,999開始一路下降到使用32位浮點的1.0/1.0。我正在努力弄清楚如何做到這一點,但這裏是我到目前爲止(不知道它是否會工作):使用java計算float數組中遞增數字的總和

編輯:對不起打開這個東西備份,但我得到一個1.0對於這兩個答案,我很確定這是不正確的。有誰知道我做錯了什麼?

public class FloatSum { 

public static float increasingSum (float numbers1){ 
float sum1 = 0; 
for (int i = 1; i <= 15000000; i++){ 
    sum1 = sum1 + 1/i; 
    } 
return sum1; 
} 

public static float decreasingSum (float numbers2){ 
float sum2 = 0; 
for (int i = 15000000; i >= 1; i--){ 
    sum2 = sum2 + 1/i; 
    } 
return sum2; 
} 

public static void main(String[] args) { 
float sum1 = 0; 
float sum2 = 0; 

System.out.println(increasingSum(sum1)); 
System.out.println(increasingSum(sum2)); 
} 
} 
+0

如果我正確地理解了這個問題,你最後在最後加上'2/1 + 2/2 + 2/3 + ... + 2/14999999' +'1/15000000'。 –

+0

'1/i'做整數除法,因此結果總是0. – Voo

+0

很好的結果。我將「int i = 1」更改爲「float i = 1」,現在兩個答案都達到了無窮大。我還需要改變什麼?提前致謝。 – Brett

回答

1

您在for循環中的邏輯不正確。哈哈,我不太清楚你要告訴它做什麼,但讓我們看看我們是否可以通過它...

忘記現在的代碼的其餘部分,並專注於什麼for循環是這樣做:

您將float變量'a'初始化爲1/x。將最終值設置爲數組的長度(好)。然後你將變量'a'加1和'x'加1 ...

現在想想這樣,你將'a'初始化爲1/x,使它成爲1.它通過循環a = 1的值。然後它將x增加1,並將a增加1.現在認真思考,因爲這是你的邏輯有缺陷的地方。這實際上現在使x = 2,但你也使a = 2。'x'和'a'是獨立變量。重讀for循環的定義,看看你是否可以調和你正在嘗試做的事情。

現在,一個循環允許你做迭代。在這種情況下,你有三千萬(15,000,000「倒數」和15,000,000倒「倒數」)。因此,讓兩個for循環,每1500萬次迭代

for (int i = 1; i <= 15000000; i++){ 
statements; 
} 

for (int i = 15000000; i >= 1; i--){ 
statements; 
} 

現在,你想加在一起1.0/1.0 + 1.0/2.0 + ... + 1.0/15,000,000.0。在0初始化SUM1:

float sum1 = 0; 

每次迭代您要添加1 /我的總和。因此,內部的每個for循環的語句將看起來像

sum1 += 1/i; 

這是一樣的

sum1 = sum1 + 1/i; 

有你有它。對於第一個循環,每次迭代都會增加1/i,從i = 1開始到i = 15,000,000結束。對於第二個循環,它增加了1/i,從i = 15,000,000開始並停在i = 1。顯然,在你的情況下,你可以用'numbers1.length'替換15,000,000。然後返回sum1,所有的錯誤就會消失。

注意:小心如何約束for循環。確保它包含最終值。 (注意< = 15,000,000,在兩個循環中大於等於1)這對你的代碼沒有太大的影響,答案也會一樣,但在將來它會很重要。如果你想,但看這

+0

感謝您的幫助!現在變得更有意義了。 – Brett

5

由於這是功課,我會限制我的回答一對夫婦的提示:

  1. 你不需要數組:單個標累加器變量就足夠了。將其初始化爲零並將其添加到每個項。
  2. 不要循環總和的條件,循環遍歷分母(非常方便的是整數)。
+0

謝謝,我會考慮一下,看看我能想出什麼。 – Brett

+0

如果有15,000,000個這樣的詞,我如何有效地添加每個詞? – Brett

+1

@ user1157541:對於現代計算機,1500萬次微不足道的重複就是孩子的遊戲。如果我在你的鞋子裏,我會首先關注正確性,並在以後擔心表現。 – NPE

2

完全同意aix。 至於爲什麼你的代碼沒有編譯:「a」變量是一個浮點數,但是你試圖用它來訪問一個數組(它需要一個int),並且因爲使用float作爲int是非法的編譯錯誤。您可以通過鑄造浮子爲int

numbers1[(int)a] 

解決的錯誤,但這將是無用的,因爲該方案仍然是錯誤的:

  • ,那麼訪問數組是沒有意義的,因爲所有的元素是0(你有正確創建數組,但所有的元素都只是初始化爲0)
  • 因爲對用於測試條件爲a < numbers1.length,在最後一次迭代,你會得到的代碼numbers1[a+1]ArrayOutOfBoundException(你」將嘗試訪問第15000001個元素)

還有一個問題是,它不會讓你的程序失敗,但似乎暴露的for迴路是如何工作的一些誤區:具體而言,你增加在每次迭代的x變量,但這是徒勞的,因爲變量x僅用於初始化:在執行循環之前,a = 1/x部分只執行一次。 這裏,簡要for引物:

for(Initializer; TestExpr; CountExpr){ Body } 

在於執行循環將執行以下的機器:

  1. 執行Initializer代碼
  2. 如果TestExpr評估爲false,轉到6
  3. 執行Body代碼
  4. 執行CountExpr代碼
  5. 轉到2
  6. 完成!

,我可以給你一個建議,就是儘量在紙上制定出如何執行你的任務,使用通常的數學結構,然後在「端口」您的解決方案爲Java。

+0

感謝所有幫助!現在變得更有意義了。 – Brett