2011-02-23 39 views
0

這裏的總和是我的代碼寫一個函數,INT n,返回奇小於n

public static int sumOfOddLessThan(int n) 
{ 
    int iResult = 0; 
    for(int i = n - 1; i > 0 && i % 2 != 0; i--) 
    { 
     iResult = iResult + i; 
    } 
    return iResult; 
} 

它不能正常工作,我不知道爲什麼:\

它應該返回4時我進入5,但在for循環讀取返回0

+1

您是否嘗試在調試器中單步執行程序? – 2011-02-23 21:49:53

+1

快捷方式:(N +(N%2))*(N +(N%2))/ 4 – 2011-02-23 22:03:04

+0

@Jesse - 因爲它是小於,不小於或等於,你需要whouldn't(N - (N %2))而不是?你的邏輯中,f(9)= 25,當它應該是16 – corsiKa 2011-02-23 22:16:13

回答

2

你把條件i % 2 != 0在for循環,而不是一個if的循環內,因此,如果甚至一度它打破了整個循環的它沒有得到滿足。

您的代碼應該是這樣的:

public static int sumOfOddLessThan(int n) 
{ 
    int iResult = 0; 
    for(int i = n - 1; i > 0; i--) 
    { 
     if(i % 2 != 0) { 
      iResult = iResult + i; 
     } 
    } 
    return iResult; 
} 

話又說回來,你甚至不需要一個循環,你可以直接通過獲取奇數比N較低的數量和平方該評估。

+0

+1用於優化循環輸出。 'int sumOdds(int n){if(n%2 == 1)n--;返回(n/2)*(n/2); 「雖然這是作業,但他必須做數學背後的數學來證明它爲什麼這樣工作。 – corsiKa 2011-02-23 22:14:14

+0

@ glowcoder:是的,我沒有發佈算法,因爲一些其他的答案已經有了它。注意:我認爲你不需要做'n - '事情,因爲'int'在被劃分時被捨去。 – Argote 2011-02-23 22:18:56

+0

'--'符合'<'而不是'<='要求。如果沒有'n - ',那麼'f(9)= 25'應該是'f(9)= 16'。 – corsiKa 2011-02-23 22:20:35

4

您的條件:

i is greater than 0 and i is not even

當調用用5作爲參數的方法中,i的第一值將是4,其連,因此,迴路不會得到評估。

for(i = n-1; i > 0; i++) { 
    if(i%2==0) { 
     iResult += i; 
    } 
} 
+0

這就是爲什麼。但是,如果這是我的功課*強烈*鼓勵您使用調試器來發現這一點。能夠遍歷代碼並自行確定是一項關鍵技能。 – rfeak 2011-02-23 21:54:11

+1

這種事情通常是相當困難的初學者使用調試器步進過線檢測只是跳過for循環。但是,是的,你是完全正確的。 – Finbarr 2011-02-23 21:55:23

1

的for循環的第二部分是一個繼續條件。在你的情況下,你的延續條件是i > 0 && i % 2 != 0

對於n = 5,第一我是4,和4%的2 0您繼續條件沒有被滿足,這就是爲什麼你的for循環退出開始前。

嘗試

for(int i = n - 1; i > 0; i--) 
    { 
     if (i % 2 != 0) 
     { 
      iResult = iResult + i; 
     } 
    } 
0

的問題是,當對條件爲假,退出循環。

因此,對於5,i=4i % 2 != 0是錯誤的,所以循環根本不被訪問。

試試這個:

for(i=((n-1)%2==0?n-2:n-1 ; i>0; i=i-2) 
{ 
    i > 0 && i % 2 != 0; 
} 

注意,通過減少2從i每一步,你不必去檢查每一個迴路校驗。

0

首先要設置爲我N-1,所以這將是4,如果n是5,那麼你的條件for循環的狀態,我必須是奇數,其中4是沒有,所以它甚至不辦一個循環。試試這個:

public static int sumOfOddLessThan(int n) 
{ 
    int iResult = 0; 
    for(int i = n-1; i > 0; i--) 
    { 
     if (i % 2 != 0) iResult += i; 
    } 
    return iResult; 
} 
2

你應該修改用於增加該系列forumla,你要做的就是修改它

早期

int i = (n+1)/2; 
return (i*i) 

修改

int i = n/2; 
return (i*i); 

TEST 輸入1: 返回0;

輸入2: 返回1;

輸入3: 返回1;

輸入4: 返回4;

輸入5: 返回4;

輸入6: 返回9;

等等......

+0

太棒了!但爲什麼當我用(i^2)替換(i * i)時它不能正常工作? – 2011-02-23 22:12:02

+0

http://download.oracle.com/javase/tutorial/java/nutsandbolts/operators.html - ^是按位或 – 2011-02-23 22:13:17

+0

糟糕!什麼是權力標誌呢? – 2011-02-23 22:14:13

相關問題