2014 dxdy logo

Научный форум dxdy

Математика, Физика, Computer Science, Machine Learning, LaTeX, Механика и Техника, Химия,
Биология и Медицина, Экономика и Финансовая Математика, Гуманитарные науки




Начать новую тему Ответить на тему
 
 Помогите исправить прогу на Си
Сообщение07.01.2009, 15:19 


25/12/08
11
задача:найти все простые числа не превосходящие заданного N>0.
Вот код:
Код:
#include <stdio.h>
#include <conio.h>
int prost(int k)
{
int x,t;
t=1;
for(x=2; (x<k)&&(t!=0);x++)
   if(k%x==0) t=0;
return t;
}

void main()
{
clrscr();
int t,i,n;
printf ("Vvedite N>0 \n");
scanf("%d",&n);
  if (n<=1)
  printf("Chislo ne yavlyaetcya prostim");
  printf("A= ");
for(i=2;i<=n;i++)
     {
     t=prost(i);
      if (t==1)
      printf("%d ", i);
     }
}

в данном коде нужно использовать подпрограмму, что собственно у меня и есть.
НО! нужно исправить код программы в соответствии с более оптимизированным решением, описанным пока что на словах:
Пусть А - множество натуральных чисел, $x \in A$,x \in[2,N] (пусть простые числа начинаются с цифры 2)Удалить из множества А все непростые(составные) числа. Для этого берем первое число из этого множества (а оно простое) и удаляем из множества все числа кратные этому числу. Так повторять, пока не переберем все числа из данного множества. Получится множество $\tilde{A}$, хранящее только простые числа.
Собственно надо исправить код программы под написанный выше алгоритм решения задачи. Нужно проводить операции над этим множеством А, но я затрудняюсь сделать это, дабы не сильно усложнить код программы, что для меня не допустимо... :( Хотя догадываюсь что в этом случае подпрограмма будет называться void ... т.е. без возвращаемого результата, которая будет перебирать числа из множества А и удалять те числа, кратные предыдущим...

 Профиль  
                  
 
 
Сообщение07.01.2009, 18:54 


12/09/08

2262
dimaudi в сообщении #174753 писал(а):
Собственно надо исправить код программы под написанный выше алгоритм решения задачи.
Тут надо не исправлять, а написать другую, поскольку приведенный код с реализацией нужного решения не имеет ничего общего.

 Профиль  
                  
 
 
Сообщение07.01.2009, 21:31 


27/11/05
183
Северодонецк
dimaudi, поищите в Интернете "решето Эратосфена" и будет вам счастье...

 Профиль  
                  
 
 
Сообщение07.01.2009, 22:33 


25/12/08
11
bekas писал(а):
dimaudi, поищите в Интернете "решето Эратосфена" и будет вам счастье...

в инете везде используются массивы, а можно ли как-нибудь напрямую вместе с циклом проводить операции над множеством ?

 Профиль  
                  
 
 
Сообщение07.01.2009, 23:18 


27/11/05
183
Северодонецк
Так множество по определению есть некоторый массив элементов (в языках программирования обычно ограничиваются массивом битов размером в 256 элементов), чем вам массив не нравится?

 Профиль  
                  
 
 
Сообщение07.01.2009, 23:32 


25/12/08
11
bekas писал(а):
Так множество по определению есть некоторый массив элементов (в языках программирования обычно ограничиваются массивом битов размером в 256 элементов), чем вам массив не нравится?

затрудняюсь выполнить передачу массива в подпрограмму, хотя ща научусь... наверное... :?

 Профиль  
                  
 
 
Сообщение08.01.2009, 00:29 


27/11/05
183
Северодонецк
Массив в C всегда передается в функцию в виде его адреса, есть исключение: можно передать по значению, если сделать обертку в виде структуры.

 Профиль  
                  
 
 
Сообщение08.01.2009, 15:05 


25/12/08
11
хелп, как исправить ?
Код:
#include <stdio.h>
#include <conio.h>
void check (int *a); //прототип

void main(){
int a[500];
int N,s,j,i;
printf ("Vvedite N>0 N=");
scanf("%d",&N);
if(N<=1) printf("Chislo ne yavlyatsya prostim");
  for(i=0; i<N; i++)
  a[i] = i;
a[1]=0;

for(i=0; i<=N; i++)
{a[i]=check(i, a[]);
if(a[i]!=0)
printf("%d ", a[i]);
  }

void check(int i, int *a) //подпрограмма, которая должна обязательно присутствовать
int s,j;
  for(s=2; s<N; s++){
    if(a[s]!=0){
     for(j=s*2; j<N; j+=s)
     a[j]=0;
    }
  }
}

ошибки:
на 15й строчке
Код:
Expression syntax

на 20й:
Код:
Declaration syntax error

за образец взята программа отсюда: http://alexeypetrov.narod.ru/C/simple_about.html

 Профиль  
                  
 
 
Сообщение08.01.2009, 16:06 


08/01/09
4
Бендеры
dimaudi писал(а):
хелп, как исправить ?

Навскидку:
1. Неправильно расставлены фигурные скобки: нет открывающей скобки перед телом определения функции check, тело main не завершается закрывающей скобкой.
2. При передаче массива в функцию нельзя писать a[], нужно просто a.
3. Сигнатура check в объявлении не совпадает с сигнатурой в определении.
4. Внутри функции check используется переменная N, хотя она не является ни глобальной, ни передается через аргументы.

В смысл программы не вдумывался, просто посмотрел на синтаксис, но мне кажется, что там есть и логические ошибки. Например, после проверки N<=1 почему-то нет выхода. Да и использование массива только для 500 элементов — не лучший способ. Лучше использовать динамический массив.

 Профиль  
                  
 
 
Сообщение08.01.2009, 16:51 


25/12/08
11
masai писал(а):
Навскидку:
1. Неправильно расставлены фигурные скобки: нет открывающей скобки перед телом определения функции check, тело main не завершается закрывающей скобкой.
2. При передаче массива в функцию нельзя писать a[], нужно просто a.
3. Сигнатура check в объявлении не совпадает с сигнатурой в определении.
4. Внутри функции check используется переменная N, хотя она не является ни глобальной, ни передается через аргументы.

В смысл программы не вдумывался, просто посмотрел на синтаксис, но мне кажется, что там есть и логические ошибки. Например, после проверки N<=1 почему-то нет выхода. Да и использование массива только для 500 элементов — не лучший способ. Лучше использовать динамический массив.

спасибо,вроде заработало, отредактированный код такой:
Код:
#include <stdio.h>
#include <conio.h>
void check (int N, int *a);
void main(){
clrscr();
int a[500];
int N,s,j,i;
printf ("Vvedite N>0 N=");
scanf("%d",&N);
if(N<=1) {printf("Chislo ne yavlyatsya prostim"); }
  for(i=0; i<=N; i++)
  a[i] = i;
a[1]=0;

for(i=0; i<=N; i++)
{check(N, a);

if(a[i]!=0)
printf("%d ", a[i]);
  }       }
void check(int N, int *a)   {
int s,j;
  for(s=2; s<N; s++){
    if(a[s]!=0){
     for(j=s*2; j<=N; j+=s)
     a[j]=0;
    }
  }

}

 Профиль  
                  
 
 
Сообщение08.01.2009, 17:13 


08/01/09
4
Бендеры
Не совсем понятно, зачем вызывать check внутри цикла, раз его аргументы не меняются. Если уж и использовать функцию в этой программе, то такую, чтобы он вычищала массив только для одного конкретного s, которое мы ей бы передавали внутри цикла c printf.

А то, что иногда последнее число оказывается неверным, думаю, можно объяснить тем, что в циклах i достигает N (<=), а j не достигает (<).

P.S. Да, и расставляйте, пожалуйста, отступы — так вам самому будет проще отслеживать тела циклов.

 Профиль  
                  
Показать сообщения за:  Поле сортировки  
Начать новую тему Ответить на тему  [ Сообщений: 11 ] 

Модераторы: Karan, Toucan, PAV, maxal, Супермодераторы



Кто сейчас на конференции

Сейчас этот форум просматривают: AntonioVivaldi


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Найти:
Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group