0

我的任务有问题。如果数字是素数,我需要找到并提醒用户。

这是我的代码:

int a = Convert.ToInt32(number);

if (a % 2 !=0 )
{
    for (int i = 2; i <= a; i++)
    {
        if (a % i == 0)
        {
            Console.WriteLine("not prime");
        }
        else
        {
            Console.WriteLine("prime");
        }
        Console.WriteLine();
    }
}
else
{
    Console.WriteLine("not prime");
}
Console.ReadLine();

我哪里出错了,我该如何解决?

4

7 回答 7

2

素数可以被 1 整除,您需要检查数字是否正好有两个除数,从 1 到数字,然后它是素数。

 int devisors = 0;
 for (int i = 1; i <= a; i++)
     if (a % i == 0)                        
          devisors++;

 if (devisors == 2)                 
     Console.WriteLine("prime");
 else
     Console.WriteLine("not prime");

您可以跳过一次迭代,因为我们知道所有整数都可以被 1 整除,那么您将完全得到素数的除数。由于 1 只有一个除数,我们需要跳过它,因为它不是素数。所以条件是数字只有一个除数而不是 1,并且数字不应该是一,因为一不是素数。

 int devisors = 0;
 for (int i = 2; i <= a; i++)
     if (a % i == 0)                        
          devisors++;

 if (a != 1 && devisors == 1)                 
     Console.WriteLine("prime");
 else
     Console.WriteLine("not prime");
于 2013-01-01T11:48:30.090 回答
1

您只是打印素数或非素数,然后继续循环,而不是停止。%2检查并不是真正需要的。适当修改:

int a = Convert.ToInt32(number);

bool prime = true;
if (i == 1) prime = false;
for (int i = 2; prime && i < a; i++)
    if (a % i == 0) prime = false;
if (prime) Console.WriteLine("prime");
else Console.WriteLine("not prime");
Console.ReadLine();
于 2013-01-01T12:05:04.187 回答
0
    private static void checkpirme(int x)
    {
        for (int i = 1; i <= x; i++)
        {
            if (i == 1 || x == i)
            {
                continue;
            }
            else
            {
                if (x % i == 0)
                {
                    Console.WriteLine(x + " is not prime number");
                    return;
                }


            }
        }
        Console.WriteLine(x + " is  prime number");
    }

where x is number to check it if prime or not

于 2014-09-05T12:27:16.717 回答
0

我做了太多的素数检查。

我这样做了:

bool isPrime = true;
        List<ulong> primes = new List<ulong>();
        ulong nCheck, nCounted;
        nCounted = 0;
        nCheck = 3;
        primes.Add(2);
        for (; ; )
        {
            isPrime = true;
            foreach (ulong nModulo in primes)
            {
                if (((nCheck / 2) + 1) <= nModulo)
                { break; }
                if (nCheck % nModulo == 0)
                { isPrime = false; }
            }
            if (isPrime == true)
            {
                Console.WriteLine("New prime found: " + (nCheck) + ", prime number " + (++nCounted) + ".");
                primes.Add(nCheck);
            }
            nCheck++;
            nCheck++;
        }

不过,这并不是您正在寻找的东西,所以我要做的是将它放在后台工作人员中,但将 ulongs 列表作为并发列表,或者您可以在 2 个线程中访问的东西。或者只是在访问列表时锁定列表。如果素数尚未解决,请等到它解决。

于 2013-01-01T15:38:59.970 回答
0

大概您的代码正在输出大量消息,这些消息看起来很混乱且毫无意义?有3个关键问题:

  • 当你决定它不能是素数时,你并没有打破你的 for 循环

  • 您假设它可能不是主要的,请参阅下面代码中的注释。

  • 您正在与 a 本身进行比较,并且它总是可以被 a 整除,for 条件中的 <= 需要是 <

代码:

int a = Convert.ToInt32(number);

if (a % 2 != 0)
{
    for (int i = 3 i < a; i += 2) // we can skip all the even numbers (minor optimization)
    {
        if (a % i == 0)
        {
            Console.WriteLine("not prime");
            goto escape; // we want to break out of this loop
        }
        // we know it isn't divisible by i or any primes smaller than i, but that doesn't mean it isn't divisible by something else bigger than i, so keep looping 
    }
    // checked ALL numbers, must be Prime
    Console.WriteLine("prime");
}
else
{
    Console.WriteLine("not prime");
}
escape:
Console.ReadLine();

正如其他人所提到的,您只能通过每次评估平方根并替换此行来循环到 a 的平方根:

for (int i = 3 i < a; i += 2)

有了这个:

float sqrRoot = (Int)Math.Sqrt((float)a);
for (int i = 3 i <= sqrRoot; i += 2)

对其进行评估很重要,否则您的程序将运行得更慢,而不是更快,因为每次迭代都将涉及平方根运算。

如果您不喜欢goto语句(我喜欢 goto 语句),请发表评论,我会将其替换为突破布尔值(或参见 Dukeling 的最新答案)。

于 2013-01-01T12:00:27.880 回答
0
public bool isPrime(int num)
{
    for (int i = 2; i < num; i++)
        if (num % i == 0) 
            return false;                       
    return num == 1 ? false : true;
}
于 2013-01-01T12:00:38.880 回答
0

另一种优化方法是使用埃拉托色尼筛法

来自维基百科

要通过 Eratosthenes 的方法找到小于或等于给定整数 n 的所有素数:
1. 创建一个从 2 到 n 的连续整数列表:(2, 3, 4, ..., n)。
2. 最初,让 p 等于 2,即第一个素数。
3. 从 p 开始,以 p 为增量向上计数,并在列表中标记每个大于 p 本身的数字。这些将是 p 的倍数:2p、3p、4p 等;请注意,其中一些可能已经被标记。
4. 找出列表中第一个大于 p 且未标记的数。如果没有这样的号码,请停止。否则,现在让 p 等于这个数(即下一个素数),然后从步骤 3 开始重复。

When the algorithm terminates, all the numbers in the list that are not marked are prime.

C# 代码

  int[] GetPrimes(int number) // input should be greater than 1
    {
        bool[] arr = new bool[number + 1];
        var listPrimes = new List<int>();

        for (int i = 2; i <= Math.Sqrt(number); i++)
        {
            if (!arr[i])
            {
                int squareI = i * i;
                for (int j = squareI; j <= number; j = j + i)
                {
                    arr[j] = true;
                }
            }

            for (int c = 1; c < number + 1; c++)
            {
                if (arr[c] == false)
                {
                    listPrimes.Add(c);
                }
            }

        }
        return listPrimes.ToArray();
    }
于 2013-01-01T12:00:58.117 回答