Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / ADO.NET, LINQ, Entity Framework, NHibernate, DAL, ORM [игнор отключен] [закрыт для гостей] / Программа с простыми числами с использованием LINQ / 6 сообщений из 6, страница 1 из 1
22.08.2010, 12:30
    #36804877
rfl
rfl
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Программа с простыми числами с использованием LINQ
Подскажите, если кто знает. Программа для вывода простых чисел в заданном промежутке от a до b. Почему простые числа выводятся только на промежутке от 2 до какого-либо числа b. А если выводишь с консоли какое-либо начальное значение больше 2 программа не работает (простые числа не выводятся).

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace SimpleNumber
{
    class Program
    {
        static void Main()
        {
            first:
                int n = 0, a = 0, b = 0;
            try
            {
                Console.Write("Введите размерность массива: ");
                n = Convert.ToInt32(Console.ReadLine());
                Console.Write("\nВведите начальное значение: ");
                a = Convert.ToInt32(Console.ReadLine());
                Console.Write("Введите конечное значение: ");
                b = Convert.ToInt32(Console.ReadLine());
            }
            catch
            {
                Console.WriteLine("Не верный формат введеных данных");
                goto first;
            }
            Console.WriteLine();
            int[] mass = new int[n];
            for (int i = a; i <= b; i++)
                mass[i] = i;
            Console.WriteLine("Выбранный диапазон чисел от {0} до {1} ", a, b);
            Console.WriteLine();
            for (int i = a; i <= b; i++)
                Console.Write("{0} ", mass[i]);
            Console.ReadLine();
            Console.WriteLine();
            //----------------------------------------------------------------------------------------------//

            Func<int, IEnumerable<int>> primeNumbers = max =>
     from i in Enumerable.Range(a, max - 1)
     where Enumerable.Range(a, i - 2).All(j => i % j != 0)
     select i;
            IEnumerable<int> result = primeNumbers(b);
            foreach (int i in result)
            {
                Console.Write("{0} ", i);
            }
            Console.ReadKey(); 
        }
    }
}
...
Рейтинг: 0 / 0
22.08.2010, 23:55
    #36805357
VitaliyBoris
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Программа с простыми числами с использованием LINQ
rfl,

Это откуда такое??? Приведенный код вообще неработоспособен.
...
Рейтинг: 0 / 0
23.08.2010, 11:10
    #36805742
stimpi
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Программа с простыми числами с использованием LINQ
rflПочему простые числа выводятся только на промежутке от 2 до какого-либо числа b. А если выводишь с консоли какое-либо начальное значение больше 2 программа не работает (простые числа не выводятся).


Все очень просто, у Вас код неправильный.

Советую почтитать про Решето Эратосфена
...
Рейтинг: 0 / 0
23.08.2010, 14:37
    #36806300
rfl
rfl
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Программа с простыми числами с использованием LINQ
VitaliyBorisrfl,

Это откуда такое??? Приведенный код вообще неработоспособен.
Код работает. Компилировал в Microsoft Visual Studio 2008. Но простые числа выводятся если выбираешь диапазон от 2. Если выбираешь от 3 и выше, выводятся просто диапазон выбранных значений. Простые числа не выводятся.
...
Рейтинг: 0 / 0
23.08.2010, 14:54
    #36806337
LR
LR
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Программа с простыми числами с использованием LINQ
rflКод работает.
конечно, код неправильный... если делать в лоб, "неумно", то код будет выглядеть примерно так:

Func<int, IEnumerable<int>> primeNumbers = max =>
from i in Enumerable.Range(a, max - a + 1)
where Enumerable.Range(2, i - a).All(j => i % j != 0)
select i;

но не составит труда нагуглить более "умные" решения (проверять лишь нечетные и 2, и т.п.)
...
Рейтинг: 0 / 0
26.08.2010, 13:57
    #36812977
LR
LR
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Программа с простыми числами с использованием LINQ
может не в тему, однако... просматривал вскользь доку о Parallel LINQ (PLINQ) в FW4, опробовал на этом примере (4-ядерный серверок).
PLINQ отработал в три раза быстрее!
PLINQ загрузил все четыре почти на 100% (против 25% - LINQ)

и, главное, модификация кода запроса вылилась аж в

Func<int, IEnumerable<int>> primeNumbers = max =>
from i in Enumerable.Range(a, max - a + 1) .AsParallel()
where Enumerable.Range(2, i - a).All(j => i % j != 0)
select i;

(нифигасебедумалясебе, ну мокрософты дают!)
...
Рейтинг: 0 / 0
Форумы / ADO.NET, LINQ, Entity Framework, NHibernate, DAL, ORM [игнор отключен] [закрыт для гостей] / Программа с простыми числами с использованием LINQ / 6 сообщений из 6, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]