2011-02-23 65 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

相关问题