((i%2 == 0)&&(i%i == 0))此技术不适用于生成素数c#

Sye*_*aza 0 .net c#

嗨!我正在尝试生成素数,但我的条件i%i是产生错误.

我收到错误"尝试除以零".

我该怎么解决这个问题?

int a, n, i;

Console.WriteLine("Enter ur number");

n = Convert.ToInt32(Console.ReadLine());

for (i = 0; i <= n; i++)
{
    if ((i % 2 == 0) && (i % i == 0))
    {
        a = i;
        Console.WriteLine("The prime numbers are", a);
    }
}

Console.ReadLine();
Run Code Online (Sandbox Code Playgroud)

希望很快听到你的意见......

Dav*_*nan 13

i为零时,第一次绕过你正在进行的循环会0 % 0导致除零误差.

至于你的功能试图做什么,我不知道.我在这里看不到任何与素数有关的东西.你只是发现所有偶数小于n.

我们来看看if测试:

if ((i % 2 == 0) && (i % i == 0))
Run Code Online (Sandbox Code Playgroud)

第二部分,i % i == 0只要i不是,就永远是真的0.那部分是虚假的.并i % 2 == 0简单地测试是否i是偶数.

您的代码实际上打算做什么?你想测试一个数字是否是素数?如果是这样,最简单的方法是这样的:

static bool isPrime(int n)
{
    Debug.Assert(n>0);
    for (int i=2; i<n; i++)
        if (n % i == 0) // n is exactly divisible by i, so n is not prime
            return false;
    return true; // we could not find a factor, so n must be prime
}
Run Code Online (Sandbox Code Playgroud)

您当前的代码无法输出任何数字,因为您的调用Console.WriteLine不太正确.你的意思是:

Console.WriteLine("The prime numbers are: {0}", a);
Run Code Online (Sandbox Code Playgroud)

另一个要点是您的代码版本将primality test与I/O代码混合在一起.在一个大的例程中将它们混合在一起使您更难理解和调试代码.将素性测试拆分为单独的函数,如我在此处所示,您可以更轻松地检查其正确性.一旦知道它是正确的,就可以从IO代码中使用它.然后您可以集中精力使您的IO代码正确.这看起来像这样:

Console.Write("Enter your number: ");
int n = Convert.ToInt32(Console.ReadLine());
Console.WriteLine("The prime numbers are:");
for (int i = 1; i <= n; i++)
    if (isPrime(i))
        Console.WriteLine(i);
Console.ReadLine();
Run Code Online (Sandbox Code Playgroud)

  • @Snicksie是的,我知道,谢谢.我可以使用各种其他技术来提高性能.我只是想把它推到Syed的适当级别.在我们尝试跑步之前学会走路. (3认同)
  • 为了获得更高的性能,你应该只使用`i <sqrt(n)`而不是`i <n`.这仍然是正确的. (2认同)
  • 既然你可以测试任何数字的素数,你可以循环i从1到n并输出数字,如果`isPrime(i)`返回`true`. (2认同)