提问人:Vlad Mikhalkin 提问时间:4/7/2023 最后编辑:darclanderVlad Mikhalkin 更新时间:4/8/2023 访问量:99
while循环不工作的退出条件?
Exit condition for while-loop not working?
问:
我刚刚开始学习 C#,我正在尝试制作一个程序,该程序可以找到一个人输入的两个数字之间所有质数的总和。但是无论我尝试做什么,我的程序总是停留在 3 或 5 上。我真的很感激能解释一下我做错了什么以及如何解决它,因为我已经被困了两天,没有任何线索。 谢谢!
using System;
public class MainClass
{
public static void Main()
{
int startValue = int.Parse(Console.ReadLine());
int endValue = int.Parse(Console.ReadLine());
int number = startValue;
int primeNumber = 1;
int sum = 0;
while (number < endValue)
{
if (((number % 2 == 0) && (number != 2)) || ((number % 3 == 0) && (number != 3)) && (number > 1)) //looking for a prime number
{
}
else
{
primeNumber = number;
sum = sum + primeNumber;
}
number = primeNumber + 1;
Console.WriteLine($"{sum} and {primeNumber}");
}
Console.WriteLine($"Sum of the prime numbers= {sum}");
}
}
由于我不是很有经验,我试图在这里和那里更改一些代码,更改它的位置,并将“while”更改为“for”。到目前为止没有运气
答:
试试这个...
public class Program
{
public static void Main(string[] args)
{
int startValue = 1;
int endValue = 100;
int sum = 0;
while (startValue <= endValue)
{
if (Program.IsPrime(startValue)) {
sum += startValue;
}
startValue++;
}
Console.WriteLine("Sum of prime number is: " + sum);
}
static bool IsPrime(int number)
{
if (number < 2) return false; // Prime numbers start at 2
if (number == 2 || number == 3) return true; // 2 and 3 are prime
if (number % 2 == 0 || number % 3 == 0) return false; // multiples of 2 and 3 are not prime
// Check odd numbers up to the square root of the input number
for (int i = 5; i * i <= number; i += 6)
{
if (number % i == 0 || number % (i + 2) == 0)
{
return false;
}
}
return true;
}
}
评论
List<int>
似乎@NishanDhungana已经提供了更好的代码版本,但要回答:
“但我的程序总是停留在 3 或 5 上,无论我尝试做什么。我真的很感激能解释一下我做错了什么”
我首先建议您查看如何调试(由 @DourHighArch 提供),但为了简化这一点,您可以使用 print 语句来轻松理解正在发生的事情。
如果我们看一下你的代码,我们就会发现,只要小于 .所以为了让循环停止,应该是 .让我们假设 , .有了这个假设,将在第一次迭代中。在您的代码中,它不会被检测为质数,因此我们继续。您更新,这意味着.正如你所说,这适用于 和 ,所以让我们来看看当 .while (number < endValue)
number
endValue
number
>= endValue
startValue = 0
endValue = 10
number
0
number = primeNumber + 1
number = 1 + 1
2
3
number = 3
因为我们输入 和 ,是增加的,我们设置 。现在,这就是你的循环失败的地方。,所以我们仍然处于 while 循环中。四能被二整除,它不是二,所以我们不输入。相反,我们再次设置。但是 primeNumber 自上次将其设置为 3 以来没有更改。所以数字再次设置为 4,因此你陷入了无限循环。number = 3
else
primeNumber = 3
sum
number = primeNumber + 1
number = 4
4 < 10
else
number = primeNumber + 1
为了简单起见(如果我的文字墙太杂乱无章),我建议您在 while 循环的每次迭代中打印每个变量并尝试了解正在发生的事情。为什么会更新值或为什么它们保持不变?问题是将数字设置为 4 后,它不再更新。
评论
number = primeNumber + 1;
应为或更短number = number + 1;
number++;