C# 并非所有代码路径都返回值。获取给定范围内所有素数的方法不起作用 [重复]

C# not all code paths return a value. Method to get all prime numbers in given range is not working [duplicate]

提问人:Angelos Makrygiannis 提问时间:4/3/2023 最后编辑:GSergAngelos Makrygiannis 更新时间:4/3/2023 访问量:59

问:

我正在学习 C#,但我正在为一项任务而苦苦挣扎。
我尝试编写一个程序,它要求一个数字范围,并返回所有质数。

但是,我总是收到错误:

并非所有代码路径都返回值

首先,我制作了一个函数来检查给定的数字是否是质数,它似乎有效,代码如下:

public bool IsPrime(int theNumber)
{
    for(int i = 2; i <= (theNumber/2)+1; i++)
    {
        if(theNumber%i == 0)
        {
            return false;
        }
    }

    return true;

现在我想循环它,并返回该范围内的所有质数......但这行不通。for

似乎问题是我缺少一个语句,以防 if 布尔值为 false。但显然,如果我的第一个方法返回 false,我不想要一个。returnreturnisPrime(int theNumber)

这是我拥有的代码:

public int AllPrimesInRange(int lowerEdge, int upperEdge)
{
    for(int i = lowerEdge; i <= upperEdge; i++)
    {
        if (IsPrime(i))
        {
            return i;
        }              
    }

我希望有人能帮助我。先谢谢你。

C# for 循环 素数 逻辑

评论

1赞 GSerg 4/3/2023
你意识到你的函数,如果它有效,可能只能返回一个数字,而不是几个数字?并且它仍然需要返回一些东西,以防 和 之间没有质数?看起来你想要一个迭代器函数AllPrimesInRangelowerEdgeupperEdge
0赞 Angelos Makrygiannis 4/3/2023
哦,谢谢你的超快速帮助。好吧,我想我退后一步,再想一想。
0赞 johnny 5 4/3/2023
你应该看看原筛。你真的只需要检查一个数字的 SQRT 的因子,看看它是否是质数

答:

0赞 Dmitry Bychenko 4/3/2023 #1

看来你想要一个:IEnumerable<int>

理想情况下,如果没有质数,我希望它什么都不返回

让我们实现它:

public IEnumerable<int> AllPrimesInRange(int lowerEdge, int upperEdge) {
  lowerEdge = Math.Max(lowerEdge, 2);

  // Special Case - 2 - the only even prime
  if (lowerEdge == 2 && upperEdge >= lowerEdge)
    yield return 2; 

  // Nearest odd int (2 -> 3, 146 -> 147 etc.)
  lowerEdge = (lowerEdge / 2 * 2 + 1); 

  for (int number = lowerEdge; number <= upperEdge; number += 2) 
    if (IsPrime(number))
      yield return number;
}

用法

foreach (int number in AllPrimesInRange(35, 145)) {
  Console.WriteLine(number);  
}

请注意,与此不同的是,该方法很可能不返回任何内容,即 永远不会执行。returnyield return

小提琴