6

我是 C# 的新手。如果用户在文本框中输入任何整数,我想编写类似的程序,在列表框中显示素数。(这意味着,如果他们写 10,它将显示 0-10 的素数,或 0-20 的 20 等)。

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

谢谢你的提示;-)

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

====== 再次您好,

我需要一些关于我的代码的反馈:

        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);
            }

        }
4

8 回答 8

11

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

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

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

于 2009-05-20T07:17:02.433 回答
6

你需要知道:

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

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

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

于 2009-05-20T07:16:38.487 回答
4

我在我的博客上讨论了使用埃拉托色尼筛法创建素数:

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);

...获得 IEnumerable 最多 2000 个素数。

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

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

于 2009-05-20T08:03:19.280 回答
3

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

于 2009-05-20T07:18:53.943 回答
1

这是对编辑的回应:

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

如果您想将素数显示为 Windows 窗体应用程序,那么您还需要为其设计用户界面。对于这样一个小问题要解决,这有点矫枉过正。您可以做的最简单的设计是ListBox在您的表格中填写一个(示例)。

如果您真的热衷于学习 Windows 窗体或 WPF,那么这里有几个资源

于 2009-05-20T07:47:04.073 回答
1

我最近正在编写一个例程来实现 Eratosthenes 的 Sieve 并遇到了这个线程。仅用于档案,这是我的实现:

    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”播种它。

于 2010-11-17T18:22:36.330 回答
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();
   }
}
于 2011-11-22T05:18:00.230 回答
0

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

于 2012-04-24T13:43:11.127 回答