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, Супермодераторы



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

Сейчас этот форум просматривают: нет зарегистрированных пользователей


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

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