素数c#

时间:2009-05-20 07:13:00

标签: c# primes

我是C#的新手。我想编写类似的东西,如果用户将在文本框中输入任何整数,则在列表框中显示素数。 (也就是说,如果他们写10,它将显示0-10的素数,或0-20的20,等等。)

在编程之前,我应该先考虑什么? 我知道互联网上有很多例子,但首先我想知道我需要什么?

感谢您提示; - )

=== 多谢你们。所以你建议最好先在Console应用程序中做到这一点? 我使用控制台应用程序做了一个非常简单的“For Loop”示例,但是当我尝试在Windows窗体应用程序中执行它时,我不确定如何实现它。 我担心如果我继续在控制台中做示例,那么我将很难在Windows Form Apps中执行此操作。 你觉得怎么样?

====== 你好,再次,

我的代码需要一些反馈:

        Console.WriteLine("Please enter your integer: ");
        long yourInteger;
        yourInteger = Int32.Parse(Console.ReadLine());

        //displaying the first prime number and comparing it to the given integer
        for (long i = 2; i <= yourInteger; i = i + 1)
        {
            //Controls i if its prime number or not
            if ((i % 2 != 0) || (i == 2))
            {
                Console.Write("{0} ", i);
            }

        }

8 个答案:

答案 0 :(得分:11)

好吧,首先我会考虑如何找到素数,然后在控制台应用程序中写入读取行,进行数学运算并写入结果(纯粹因为这是你能做的最简单的事情) ,并涵盖了稍后您需要的相同解析等逻辑。

当您对素数生成感到满意时,请查看如何进行winforms - 如何在表单上放置列表框,文本框和按钮;如何处理(按钮的)click事件,以及如何从文本框中读取并将值写入列表框。你的主要代码应该可以“按原样”......

如果您还没有IDE,请注意C# Express是免费的,并且将涵盖以上所有内容。

答案 1 :(得分:6)

你需要知道:

  • 如何从Windows应用程序中读取用户输入
  • 如何生成范围内的素数
  • 如何以您想要的方式编写输出

我强烈建议您将这些任务分开。一旦你让他们每个人分开工作,你就可以把它们放在一起。 (Marc建议为素数部分编写一个控制台应用程序 - 如果您不想进行单元测试,这是一个很好的建议。如果您使用其他语言的单元测试,那么它很容易启动和运行NUnit。控制台应用程序肯定会更快开始使用。)

理论上,对于可能长时间运行的任务(例如,用户输入1000000作为第一个数字),您通常应该使用后台线程来保持UI响应。但是,我会先忽略它。请注意,当您计算素数时,您的应用程序将显示为“挂起”,但首先让它工作。一旦您对简单版本充满信心,如果您有冒险精神,可以查看BackgroundWorker之类的内容。

答案 2 :(得分:4)

我讨论了在我的博客上使用Sieve of Eratosthenes创建素数:

http://blogs.msdn.com/mpeck/archive/2009/03/03/Solving-Problems-in-CSharp-and-FSharp-Part-1.aspx

代码看起来像这样......

public IEnumerable<long> GetPrimes(int max)
{
    var nonprimes = new bool[max + 1];

    for (long i = 2; i <= max; i++)
    {
        if (nonprimes[i] == false)
        {
            for (var j = i * i; j <= max; j += i)
            {
                nonprimes[j] = true;
            }

            yield return i;
        }
    }
}

使用此代码,您可以编写这样的语句......

var primes = SieveOfEratosthenes.GetPrimes(2000);

...获得一个高达2000的IEnumerable素数。

可以在http://FSharpCSharp.codeplex.com的CodePlex上找到所有代码。

代码“按原样”,因此您应该查看它以确定它是否符合您的需求,是否需要添加错误检查等,因此将其视为样本。

答案 3 :(得分:3)

这是一个很棒的“天真”素数算法,非常适合您的需求: http://en.wikipedia.org/wiki/Sieve_of_Eratosthenes

答案 4 :(得分:1)

以下是对编辑的回复:

  

谢谢你们。所以你建议最好先在Console应用程序中做到这一点?我使用控制台应用程序做了一个非常简单的“For Loop”示例,但是当我尝试在Windows窗体应用程序中执行它时,我不确定如何实现它。我担心如果我继续在控制台中做示例,那么我将很难在Windows Form Apps中执行此操作。你觉得怎么样?

如果要将素数作为Windows窗体应用程序呈现,则还需要为其设计用户界面。对于要解决的这么小的问题来说,这有点过分。您可以做的最简单的设计是在表单中填写ListBoxexample)。

如果您真的热衷于学习Windows窗体或WPF,那么several resources就可以了。

答案 5 :(得分:1)

我最近编写了一个实现Sieve Of Eratosthenes的例程并遇到了这个帖子。仅针对档案,这是我的实施:

    static List<int> GetPrimeNumbers(int maxNumber)
    {
        // seed the master list with 2
        var list = new List<int>() {2};

        // start at 3 and build the complete list
        var next = 3;
        while (next <= maxNumber)
        { 
            // since even numbers > 2 are never prime, ignore evens 
            if (next % 2 != 0) 
                list.Add(next);

            next++;
        }

        // create copy of list to avoid reindexing
        var primes = new List<int>(list);

        // index starts at 1 since the 2's were never removed
        for (int i = 1; i < list.Count; i++)
        {
            var multiplier = list[i];
            // FindAll Lambda removes duplicate processing
            list.FindAll(a => primes.Contains(a) && a > multiplier)
                .ForEach(a => primes.Remove(a * multiplier));
        }

        return primes;
    }

如果你的素数列表中需要1,你总是可以用“1,2”播种。

答案 6 :(得分:1)

using System;
class demo
{
   static void Main()
   {
      int number;
      Console.WriteLine("Enter Number you Should be Checked Number is Prime or not Prime");
      number = Int32.Parse(Console.ReadLine());
      for(int i =2;i {
         if(number % i == 0)
         {
            Console.WriteLine("Entered number is not Prime");
            break;
         }
      }
      if(number % i !=0)
      {
         Console.WriteLine("Entered Number is Prime");
      }

      Console.ReadLine();
   }
}

答案 7 :(得分:0)

你的方法完全错了。素数是绝对的,永远不会改变。您最好的选择是预先生成一长串素数。然后提出一种算法来快速查找该数字以确定它是否在列表中。然后在你的情况下(因为你想列出给定范围内的所有内容,只需这样做)。该解决方案将比在运行时期间实现的任何素数查找算法快得多。如果输入的整数大于列表,那么您始终可以从该点开始实现算法。