문제

나는 C#을 처음 접했다. 사용자가 텍스트 상자에 정수를 입력 할 경우 Listbox에 소수를 표시하는 등의 프로그램을 프로그래밍하고 싶습니다. (이것은 10을 쓰면 0-10 또는 0-20에서 20 등의 소수를 표시한다는 것을 의미합니다).

프로그래밍을하기 전에 먼저 무엇을 고려해야합니까? 인터넷에 많은 예가 있다는 것을 알고 있지만 먼저 무엇이 필요한지 알고 싶습니다.

팁 고마워;-)

=== 감사합니다. 그래서 당신은 콘솔 응용 프로그램에서 먼저 그것을하는 것이 더 낫다고 제안하고 있습니까? 콘솔 애플리케이션을 사용하여 "For Loop"의 예를 매우 간단하게 수행했지만 Windows 양식 응용 프로그램에서 수행하려고 할 때 구현 방법을 잘 모르겠습니다. 콘솔에서 예제를 계속 수행하면 Windows Form 앱에서 수행하기가 어렵다는 것이 두렵습니다. 어떻게 생각해?

====== 안녕하세요, 다시,

내 코드로 피드백이 필요합니다.

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

        }
도움이 되었습니까?

해결책

글쎄, 우선, 나는 소수를 찾는 방법에 대해 생각하고, 라인을 읽고, 수학을하고 결과를 씁니다. 나중에 필요한 동일한 파싱 등 논리).

소수 생성에 만족하면 Winforms를 수행하는 방법을 살펴보십시오. ListBox, TextBox 및 버튼을 양식에 넣는 방법을 살펴보십시오. 클릭 이벤트를 처리하는 방법 (버튼) 및 텍스트 상자에서 읽고 값을 ListBox에 쓰는 방법. 주요 코드는 "그대로"...

아직 IDE가 없다면 C# Express 무료이며 위의 모든 것을 다룰 것입니다.

다른 팁

알아야 할 것입니다 :

  • Windows 응용 프로그램에서 사용자 입력을 읽는 방법
  • 범위 내에서 소수를 생성하는 방법
  • 원하는 방식으로 출력을 쓰는 방법

이 작업을 분리 할 것을 강력히 제안합니다. 각각을 별도로 작동하게하면 함께 모을 수 있습니다. (Marc는 소수 섹션에 대한 콘솔 앱 작성을 제안합니다. 아직 단위 테스트에 들어가고 싶지 않다면 좋은 제안입니다. 다른 언어로 단위 테스트를 사용한 경우, 일어나고 실행하기가 쉽습니다. NUNIT. 콘솔 앱은 확실히 더 빨리 시작할 것입니다.)

이론적으로 잠재적으로 장기 실행 작업 (예 : 사용자가 1000000을 첫 번째 숫자로 입력)의 경우 일반적으로 UI를 응답하기 위해 배경 스레드를 사용해야합니다. 그러나 나는 그것을 시작하기 위해 그것을 무시할 것입니다. Primes를 계산하는 동안 응용 프로그램은 "매달린"것으로 보이지만 먼저 작동하게합니다. 간단한 버전에 자신감이 있으면 볼 수 있습니다. BackgroundWorker 그리고 당신이 모험을 느끼고 있다면.

나는 그것을 사용하여 소수를 만드는 것에 대해 논의했다 에라 토스 테네스의 체 여기 내 블로그에서 :

http://blogs.msdn.com/mpeck/archive/2009/03/03/solving-problems-in-csharp-and-psharp-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 년까지 ienumerible primes를 얻기 위해.

모든 코드는 CodePlex에서 찾을 수 있습니다 http://fsharpcsharp.codeplex.com.

코드는 "있는 그대로"이므로이를보고 오류 확인 등을 추가 해야하는지 여부를 결정해야하므로 샘플로 취급하십시오.

다음은 훌륭한 "순진한"소수 알고리즘이 있습니다. 귀하의 요구에 적합합니다.http://en.wikipedia.org/wiki/sieve_of_eratosthenes

편집에 대한 응답은 다음과 같습니다.

감사합니다. 그래서 당신은 콘솔 응용 프로그램에서 먼저 그것을하는 것이 더 낫다고 제안하고 있습니까? 콘솔 애플리케이션을 사용하여 "For Loop"의 예를 매우 간단하게 수행했지만 Windows 양식 응용 프로그램에서 수행하려고 할 때 구현 방법을 잘 모르겠습니다. 콘솔에서 예제를 계속 수행하면 Windows Form 앱에서 수행하기가 어렵다는 것이 두렵습니다. 어떻게 생각해?

소수를 Windows 양식 응용 프로그램으로 제시하려면 사용자 인터페이스도 설계해야합니다. 그것은 그러한 작은 문제가 해결 되기에는 약간 과잉입니다. 가장 쉬운 디자인은 ListBox 당신의 형태로 (예시).

Windows 양식 또는 WPF 학습에 정말로 열심이 있다면 여러 자원 이것을 위해.

나는 최근에 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"로 시드 할 수 있습니다.

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

당신의 접근 방식은 전적으로 잘못되었습니다. 소수는 절대적이며 결코 변하지 않을 것입니다. 가장 좋은 방법은 소수의 긴 목록을 사전 생성하는 것입니다. 그런 다음 알고리즘을 제시하여 해당 숫자를 신속하게 찾아 목록에 있는지 확인하십시오. 그런 다음 귀하의 경우 (주어진 범위에 모든 것을 나열하고 싶기 때문에) 그렇게합니다). 이 솔루션은 런타임 중에 구현 된 알고리즘을 찾는 소수보다 훨씬 빠릅니다. 입력 된 정수가 목록보다 크면 해당 시점에서 시작된 알고리즘을 항상 구현할 수 있습니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top