Форум программистов, компьютерный форум, киберфорум
C для начинающих
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.67/6: Рейтинг темы: голосов - 6, средняя оценка - 4.67
0 / 0 / 0
Регистрация: 02.11.2012
Сообщений: 10
1

Не удается реализовать Решето Эратосфена

04.11.2013, 20:55. Показов 1163. Ответов 3
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
задача: быстро найти простые числа. проблема в том, что в СИ разбираюсь плохо ( так что код может кому-то показаться наивным ). прошу найти ошибки в алгоритме

C
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
  
   #include<stdio.h>
   #include<stdlib.h>
   #include<conio.h>
   #include<time.h>
 
 
  int main()
   {
      int L=2, N=30, A[305], j, x=0; 
      clock_t start,end;
      
      start=clock();
// заполнение массива нулями       
       for ( L; L<=N; L++)  
      {         
        A[L]=0;
        printf("%d\n",A[L]);   
      }
      L=2;
// алгоритм решето Эратосфена
       for ( L, x; j<=N; L++, x++)
       {
           if (A[L])
           j=L*L+L*x;    
           A[j]=0;
       }    
       L=2;
//вывод новых значений        
       for ( L; L<=N; L++)          
        printf("%d\n",A[L]);
        
        end=clock();
        printf(" %6.3f sec\n",(double)(end-start)/(double)CLOCKS_PER_SEC);
      getch();
      return 0;
   }
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
04.11.2013, 20:55
Ответы с готовыми решениями:

Решето Эратосфена
Добрый день!помогите пожалуйста найти ошибку.код состоит из трех файлов.в первом из...

Решето Эратосфена (работает некорректно)
вроде компилируется однако не работает корректно #include&lt;stdio.h&gt; int main() { int...

Наибольший простой делитель числа и Решето Эратосфена
Необходимо найти наибольший простой делитель числа &quot;n&quot;, используя решето Эратосфена. Программа...

Нахождение первых пятиста простых чисел через решето Эратосфена
На языке си

3
224 / 219 / 77
Регистрация: 24.09.2012
Сообщений: 511
Записей в блоге: 2
04.11.2013, 21:14 2
Лера789, в 23-й строке вы используете неопределённую переменную j, на момент первого прохождения по циклу for в j может быть всё что угодно.

Добавлено через 5 минут
А здесь вы что имели ввиду?
C
if (A[L])
j=L*L+L*x;    
A[j]=0;

Только вторая строка должны быть в теле условия или вторая и третья?

Мой совет: ВСЕГДА выделяйте тело условия фигурными скобками, даже если блок состоит из одного оператора.
C
if (A[L]) {
    j=L*L+L*x;
}
A[j]=0;
C
if (A[L]) {
    j=L*L+L*x;
    A[j]=0;
}
0
0 / 0 / 0
Регистрация: 02.11.2012
Сообщений: 10
04.11.2013, 23:46  [ТС] 3
C
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
   #include<stdio.h>
   #include<stdlib.h>
   #include<conio.h>
   #include<time.h>
 
 
  int main()
   {
      int L=2, N=30, A[305], j=0, x=0; 
      clock_t start,end;
      
      start=clock();
// çàïîëíåíèå ìàññèâà íóëÿìè       
       for ( L; L<=N; L++)          
        A[L]=1;  
      L=2;
// àëãîðèòì ðåøåòî Ýðàòîñôåíà
       for ( L, x; j<=N; L++, x++)
       {
           if (A[L])
           j=L*L+L*x;    
           A[j]=0;
       }    
       L=2;
//âûâîä íîâûõ çíà÷åíèé        
       for ( L; L<=N; L++)          
       { 
           if (A[L])
             printf("%d\n",L);
       }  
        end=clock();
        printf(" %6.3f ᥪ\n",(double)(end-start)/(double)CLOCKS_PER_SEC);
      getch();
      return 0;
   }
исправила логические ошибки. но все равно находит не то


про скобки возьму на заметку )

Добавлено через 2 часа 26 минут
код работает но с дефектом
по условию надо Вывести числа в порядке возрастания, по одному в строке. Если между M и N включительно нет простых - вывести "Absent"

C
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
// ïîïûòêà ðåàëèçîâàòü ðåøåòî Ýðàòîñôåíà   
  
   #include<stdio.h>
   #include<stdlib.h>
   #include<conio.h>
   #include<time.h>
 
 
  int main()
   {
      int L=5, N=10, A[30], j=0; 
      clock_t start,end;
      
      start=clock();
// çàïîëíåíèå ìàññèâà åäèíèöàìè     
       for ( L; L<=N; L++)          
        A[L]=1;  
      L=5;
// àëãîðèòì ðåøåòî Ýðàòîñôåíà
       for ( L; L*L<=N; L++)
           {  
                if (A[L]) 
                {
                   for (j=L*2; j<=N ;j=j+L)
                  {  A[j]=0; 
                  } 
                }
           }  
       
       L=5;
//âûâîä íîâûõ çíà÷åíèé    
         
       for ( L; L<=N; L++)          
       { 
           if (A[L])    printf("%d\n",L);  
           printf("Absent\n");  
       }  
        end=clock();
        printf(" %6.3f ᥪ\n",(double)(end-start)/(double)CLOCKS_PER_SEC);
      getch();
      return 0;
   }
0
224 / 219 / 77
Регистрация: 24.09.2012
Сообщений: 511
Записей в блоге: 2
05.11.2013, 11:59 4
Сначала у вас N=30, A[305] (видимо, 305 -- это опечатка), а теперь N=10, A[30], т.е. вы имеете массив из 30-ти элементов, а в циклах проходите по 10-ти элементам.

Зачем вам массив из единиц? Вы собрались искать простые числа в массиве из единиц?
C
// заполнение массива единицами     
       for ( L; L<=N; L++)          
        A[L]=1;  
      L=5;
и то здесь только первые N=10 элементов из 30-ти равны единицам, остальные случайные числа из памяти.

И почему теперь у вас L=5?

P.S. Осталось ещё немного подумать и у вас всё получится, надеюсь.
0
05.11.2013, 11:59
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
05.11.2013, 11:59
Помогаю со студенческими работами здесь

Получить все простые числа I, удовлетворяющие неравенству, используя решето Эратосфена
Даны натуральные числа К, Ь (К &lt; Ь). Получить все простые числа I, удовлетворяющие неравенству: К &lt;...

Битовое решето Эратосфена: Исправить второй цикл, чтобы уменьшилось время работы программы
Доброго времени суток! Подскажите, пожалуйста, как исправить второй цикл, чтобы уменьшилось время...

Решето Эратосфена
Определить простые числа методом просеивания с помощью &lt;&lt;решета Эратосфена&gt;&gt; с _битовой упаковкой_...

Решето Эратосфена
Возможно ли найти простые числа методом решета Эратосфена с помощью вектора за один проход? ...

Решето Эратосфена
Всем привет! Пишу на F# алгоритм решета Эратосфена. Программа зацикливается в рекурсии и пишет нет...

Решето Эратосфена
Написать функция для выполнения алгоритма решить Эратосфена! зарания спасибо!!!


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
4
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru