6

私はC#が初めてです。そして、ユーザーがテキストボックスに整数を入力すると、リストボックスに素数を表示するようなプログラムを作成したいと思います。(つまり、10 と書くと、0 から 10 までの素数、または 0 から 20 までの 20 などの素数が表示されます)。

プログラミングを行う前に、まず何を考慮する必要がありますか? インターネットには多くの例があることは知っていますが、まず何が必要か知りたいですか?

ヒントをありがとう;-)

=== ありがとうございます。では、最初にコンソール アプリケーションで実行する方がよいということですか? コンソール アプリケーションを使用して非常に単純な "For ループ" の例を作成しましたが、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);

... 2000 までの素数の IEnumerable を取得します。

すべてのコードは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 ループ" の例を作成しましたが、Windows フォーム アプリケーションで実行しようとすると、実装方法がわかりません。残念ながら、コンソールで例を実行し続けると、Windows フォーム アプリで実行するのが難しくなります。どう思いますか?

素数を Windows フォーム アプリケーションとして表示する場合は、そのためのユーザー インターフェイスも設計する必要があります。このような小さな問題を解決するには、少しやり過ぎです。最も簡単な設計はListBox、フォームに a を入力することです ( example )。

Windows フォームや WPF について学習したい場合は、そのためのリソースがいくつかあります。

于 2009-05-20T07:47:04.073 に答える
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」でシードできます。

于 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 に答える