Простые числа из списка в текстовое поле - PullRequest
0 голосов
/ 10 апреля 2020

Я хочу отображать простые числа с помощью кнопки из LISTBOX в текстовое поле. Интерфейс правильно отображает простые числа, но только от 1 до 10, после этого алгоритм изменяется и показывает не простые значения в виде простых значений, таких как 44.

 private void primnr()
    {
        int n = listBox1.Items.Count;
        bool prim = true;
        for (int i = 2; i < n; i++)
        {

            for (int j = 2; j <n; j++)
            {
                if (i!=j && i%j==0)
                {
                    prim = false;
                    break;
                }
            }
            if (prim)
            {
                textBox2.Text = textBox2.Text + "Numar prim: " + listBox1.Items[i].ToString() + Environment.NewLine;
            }
            prim = true;
        }



    }

Ответы [ 3 ]

0 голосов
/ 10 апреля 2020

Ваш алгоритм хорош, несмотря на то, что он не нужен для j до go дальше, чем половина значения i. https://dotnetfiddle.net/ZafFsb отпечатки:

2, 3, 5, 7, 11, 13, 17, 19, 23, 29, 31, 37, 41, 43, 47,

Так что я бы сказал, что ваша проблема - значения, хранящиеся в listBox1.Items[i], убедитесь, что Items[43] = 43? Установите точку останова и проверьте значения.

0 голосов
/ 10 апреля 2020

Давайте разделим задачу на два : генерируем простые числа (логики) и отображаем их в TextBox (UI):

  private static IEnumerable<int> Primes() {
    yield return 2;
    yield return 3;

    List<int> primes = new List<int>() {3}; 

    for (int value = 5; ; value += 2) {
      int n = (int) (Math.Sqrt(value) + 0.5); // round errors for perfect squares

      foreach (int divisor in primes) {
        if (divisor > n) {
          primes.Add(value);

          yield return value;

          break;
        }
        else if (value % divisor == 0)
          break;  
      }
    }  
  }

Теперь, кажется, вы хотите получить элементы списка с простыми индексами, т.е.

listBox1.Items[2], listBox1.Items[3], listBox1.Items[5],..., listBox1.Items[101], ...

Вы можете запросить Primes() с помощью Linq

using System.Linq;

...

var results = Primes()
  .Take(index => index < listBox1.Count)
  .Select(index => $"Numar prim: {listBox1.Ites[index]}");

// Time to Join results into a single string
textBox2.Text = string.Join(Environment.NewLine, results);   
0 голосов
/ 10 апреля 2020

Попробуйте это:

 private void primnr()
 {
    int n = listBox1.Items.Count;
    bool prim = true;
    for (int i = 2; i < n; i++)
    {
        prim = true;
        for (int j = 2; j < listBox1.Items[i]/2; j++)
        {
            if (listBox1.Items[i] % j == 0)
            {
                prim = false;
                break;
            }
        }
        if (prim)
        {
            textBox2.Text = textBox2.Text + "Numar prim: " + listBox1.Items[i].ToString() + Environment.NewLine;
        }
    }
  }
...