我是初学C#程序员,为了提高我的技能,我决定尝试使用Project Euler。网站上的第一个问题要求你找到1000和1000以下的所有倍数的总和。由于我基本上做了两次同样的事情,我做了一个方法来逐步增加一个基数,并添加总和所有的答案都是如此。
public static int SumOfMultiplication(int Base, int limit)
{
bool Escape = false;
for (int mult = 1; Escape == true; mult++)
{
int Number = 0;
int iSum = 0;
Number = Base * mult;
if (Number > limit)
return iSum;
else
iSum = iSum + Number;
}
无论我为两个参数添加什么,它总是返回零。我99%肯定它与变量的范围有关,但我不知道如何修复它。感谢所有帮助。
提前致谢,
萨姆
答案 0 :(得分:6)
你的循环实际上从未执行过:
bool Escape = false;
for (int mult = 1; Escape == true; mult++)
最初 Escape
设置为false,因此第一次测试失败(Escape == true
返回false
)并跳过循环体。
如果您尝试访问其定义范围之外的变量,编译器会告诉您,这不是问题所在。你也错过了一个返回声明,但这可能是一个错字。
我还要注意,你的代码永远不会检查要添加到总和中的数字是否实际上是3或5的倍数。还有其他问题(例如,iSum
是在循环并在每次迭代后初始化为0
,但是我会让你解决这个问题,因为这是练习。在这样的情况下,调试器是你的朋友:)
编辑:如果您需要实际逻辑方面的帮助,我会很乐意提供帮助,但我想如果可能的话,您希望自己解决这个问题。
答案 1 :(得分:3)
正如其他人所指出的那样,问题在于控制流程并不像您认为的那样。这是一个常见的初学者问题。
我建议你学习如何使用调试器。初学者经常有这样一个奇怪的想法,他们不允许使用工具来解决他们的编码问题;相反,他们必须通过阅读它来推断程序中的缺陷。一旦程序变得超过一页,人类就不可能做到这一点。调试器是你最好的朋友,所以要了解它的功能非常好。
在这种情况下,如果您在调试器中逐步执行代码,则会看到正在评估循环条件,然后跳过循环。那时你不会问“为什么这会返回零?”,你会问“为什么循环体总是被跳过?”显然,这是一个更有成效的问题,因为这实际上是问题所在。
不要在调试器中单步执行任何代码。观察每个变量,观察它如何改变值(顺便说一下,调试器在更改值后立即突出显示监视窗口中的变量),并确保控制流和变量更改完全符合您的预期。注意安静的疑惑;如果有什么不寻常的事情,那么跟踪它,要么了解它为什么是正确的,要么修复它直到它。
关于实际问题:记住15,30,45,60 ......都是两者的倍数三和五,但你只想将它们加到总和上一次。解决Project Euler问题时,我的建议是编写与您尝试解决的代码一样的代码。尝试首先在“伪代码”中写出问题。我将其伪代码为:
sum = 0
for each positive number under 1000:
if number is multiple of three or five then:
add number to sum
一旦你拥有了这个伪代码,你就会注意到它的微妙之处。比如,包含1000个?问题是“低于1000”还是“高达1000”?确保你的循环条件考虑到这一点。等等。
程序越接近实际解决的问题,就越有可能是正确的。
答案 2 :(得分:0)
它不会进入for循环,因为条件为false。
Escape == true
返回false
建议:
如果使用条件作为打破循环的限制
,则使用for循环要简单得多for(int mult = 1; something< limit; mult ++)
这种方式在大多数情况下你不需要在循环中检查条件
大多数编程语言都有运算符模除法。 http://en.wikipedia.org/wiki/Modulo_operation
这个问题可能很方便。
答案 3 :(得分:0)
此代码存在一些问题。第一个也是最重要的是,您只使用一次Escape变量。它永远不会在你的for循环中设置为false,所以它没有任何意义。它应该删除。其次,isum在for循环中声明,这意味着每次循环执行时它将继续重新初始化为0。这意味着您只能获得最后一个倍数,而不是所有倍数的加法。这是一个更正的代码示例:
int iSum = 0;
for(int mult = 1; true; mult++)
{
int Number = Base * mult;
if(Number > limit)
return iSum;
else
iSum += Number;
}