while循环不工作的退出条件?

Exit condition for while-loop not working?

提问人:Vlad Mikhalkin 提问时间:4/7/2023 最后编辑:darclanderVlad Mikhalkin 更新时间:4/8/2023 访问量:99

问:

我刚刚开始学习 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”。到目前为止没有运气

C# while 循环

评论

1赞 Sir Rufo 4/7/2023
number = primeNumber + 1;应为或更短number = number + 1;number++;
0赞 John Alexiou 4/7/2023
你的主要检查是有问题的
0赞 John Alexiou 4/7/2023
stackoverflow.com/a/58247818/380384
0赞 Vlad Mikhalkin 4/7/2023
@SirRufo如果我这样做,那么一个质数可以多次求和。找到一个后,我需要跳过“number”和“primeNumber”之间的所有数字
1赞 Dour High Arch 4/7/2023
您现在要学习的最重要的事情是如何调试

答:

0赞 Nishan Dhungana 4/7/2023 #1

试试这个...

   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;
    }
}

评论

0赞 John Alexiou 4/7/2023
由于 op 是新手,您能否制作一个不使用并且只有原始帖子试图做的运行总和的版本?List<int>
0赞 Vlad Mikhalkin 4/7/2023
问题是我对我的质数搜索没问题。它似乎运行良好,因为我尝试了多次。但是循环不起作用,我不明白为什么
1赞 darclander 4/7/2023 #2

似乎@NishanDhungana已经提供了更好的代码版本,但要回答:

“但我的程序总是停留在 3 或 5 上,无论我尝试做什么。我真的很感激能解释一下我做错了什么”

我首先建议您查看如何调试(由 @DourHighArch 提供),但为了简化这一点,您可以使用 print 语句来轻松理解正在发生的事情。

如果我们看一下你的代码,我们就会发现,只要小于 .所以为了让循环停止,应该是 .让我们假设 , .有了这个假设,将在第一次迭代中。在您的代码中,它不会被检测为质数,因此我们继续。您更新,这意味着.正如你所说,这适用于 和 ,所以让我们来看看当 .while (number < endValue)numberendValuenumber>= endValuestartValue = 0endValue = 10number0number = primeNumber + 1number = 1 + 123number = 3

因为我们输入 和 ,是增加的,我们设置 。现在,这就是你的循环失败的地方。,所以我们仍然处于 while 循环中。四能被二整除,它不是二,所以我们不输入。相反,我们再次设置。但是 primeNumber 自上次将其设置为 3 以来没有更改。所以数字再次设置为 4,因此你陷入了无限循环。number = 3elseprimeNumber = 3sumnumber = primeNumber + 1number = 44 < 10elsenumber = primeNumber + 1

为了简单起见(如果我的文字墙太杂乱无章),我建议您在 while 循环的每次迭代中打印每个变量并尝试了解正在发生的事情。为什么会更新值或为什么它们保持不变?问题是将数字设置为 4 后,它不再更新。

评论

0赞 darclander 4/8/2023
@VladMikhalkin我很高兴这是有道理的!:D这是否完全回答了您的问题?(我不想窃取公认的答案,但它可以帮助未来的用户解决同样的问题)。