0

你好!我正在尝试生成一个素数,但我的情况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();

希望能尽快听到你的...

4

6 回答 6

13

i为零时,您正在执行的第一次循环会0 % 0导致除以零错误。

至于您的功能要做什么,我不知道。我在这里看不到任何与质数相关的东西。您只是找出所有小于 的偶数n

让我们看一下if测试:

if ((i % 2 == 0) && (i % i == 0))

第二部分,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
}

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

Console.WriteLine("The prime numbers are: {0}", a);

要说明的另一点是您的代码版本将素数测试与 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();
于 2012-04-06T10:23:33.993 回答
2

改变

for (i = 0; i <= n; i++)

for (i = 1; i <= n; i++)
于 2012-04-06T10:23:30.670 回答
1

好吧,当 i 为 0 时,您正在尝试计算0%0,这确实是尝试除以零。

无论如何,除非 i 为 0,否则 i%i始终为 0。这几乎不是计算素数的方法。

于 2012-04-06T10:24:16.800 回答
1

%是模运算符。它给出了两个数字之间除法的余数。

(i % 2) == 0

将测试是否i是偶数。

(i % i) == 0

将永远返回truei > 0因为i / i = 1 remainder 0。何时i0,您将获得除以零异常,因为您正在尝试评估0 / 0

(另见:http: //msdn.microsoft.com/en-us/library/0w4e0fzs.aspx

要确定是否i是素数,您需要确保它i不能2从到的所有整数整除floor(i / 2)

于 2012-04-06T10:31:52.903 回答
0

很明显,因为您从 0 开始循环,所以您应该从 1 开始循环。

于 2012-04-06T10:25:11.073 回答
0

一个在 C 中寻找素数的儿童程序是

#include<stdio.h>

main()
{
   int n, c = 2;

   printf("Enter a number to check if it is prime\n");
   scanf("%d",&n);

   for ( c = 2 ; c <= n - 1 ; c++ )
   {
      if ( n%c == 0 )
      {
         printf("%d is not prime.\n", n);
     break;
      }
   }
   if ( c == n )
      printf("%d is prime.\n", n);

   return 0;
}

当您检查素数时:检查这是什么素数

Prime number are those which will not divided by any number except 1 and itself.

根据声明,您的支票号码应从 2 到 N-1 开始。

 bool isPrime = true;
            int number = Convert.ToInt32(Console.Read());
            int i = 2;
            while (i < number)
            {
                if (number % i == 0)
                {
                    isPrime = false;
                    break;
                }
                i++;
            }

            if (isPrime)
            {
                //Prime number
            }
            else
            {
                //Not Prime No
            }

检查这个以了解如何在某个范围 1 - 100 等之间生成素数,因此您必须将素数检查循环放在另一个计数器循环中。

于 2012-04-06T10:46:16.637 回答