Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

Простые числа(И вообще отыскание чисел(групп чисел) с наперёд заданными свойствами)

10K
23 декабря 2005 года
Maxyman
40 / / 23.12.2005
Нужен алгоритм или программа на С по отысканию простых чисел не больше данного и по проверке данного числа на простоту

Если вопрос глупый и избитый,дайте ссылочку на соответствующий источник
3.6K
23 декабря 2005 года
Denton
41 / / 18.08.2004
Код по алгоритму "Решето Эратосфена" для поиска простых чисел:

Код:
int finish=99,begin=2;
bool a[finish];
int x,y;
a[1]=false;
   
    for(x=begin;x<=finish;x++){
         a[x]=true;          
    }  
   
    for(x=begin;x<=finish/2;x++)
    {
       for(y=begin;y<=finish/x;y++){
       a[x*y]=false;                  
       }  
    }
   
    for(x=begin;x<=finish;x++)
    {
     if(a[x])
     printf("%d",&x);
    }
10K
23 декабря 2005 года
Maxyman
40 / / 23.12.2005
Цитата:
Originally posted by Denton
Код по алгоритму "Решето Эратосфена" для поиска простых чисел:



СПАСИБО
Теперь только осталось это в С перевести:)


292
23 декабря 2005 года
Matush
726 / / 14.01.2004
Цитата:
Originally posted by Maxyman
СПАСИБО
Теперь только осталось это в С перевести:)


Вот мой вариант на С для проверки является ли число простым:

 
Код:
BOOL IsSimple = true;
for(int x=2; x<=sqrt(N); x++)
    if(N%x == 0)
    {
        IsSimple = false;
        break;
    }


N - число которое надо проверить на "простоту"
IsSimple - флаг простоты (1 - простое, 0 - не простое)
10K
24 декабря 2005 года
Maxyman
40 / / 23.12.2005
Значит так.
я написал функцию is_prime,которая определяет простое число или нет и возвращает 0,если число составное и 1,если число простое.
На многочисленных примерах функция работает.
Но если я вызываю is_prime из другой функции,то она возвращает только ноль...
...что я могу делать не так?
Если это важно,я делаю программу на ТурбоС какой-то старой версии,которая даже под Windows не работает.
Заранее спасибо

P.S. только не спрашивайте,почему я программирую именно там и "не там" я программировать не могу
292
26 декабря 2005 года
Matush
726 / / 14.01.2004
исходник покажи
10K
26 декабря 2005 года
Maxyman
40 / / 23.12.2005
Цитата:
Originally posted by Matush
исходник покажи


Код:
#include<stdio.h>
 #define yes   1
 #define no    0
 int num=0;

  int  is_prime             (int);
  void goldbach_conjecture  (int);
  void closest_primes       (int);

   int main(void){

      while(num<3) {
    printf("\n\n%15s\n\n\n","  Enter an
             integer number bigger than 2");

     if ( (scanf("%d",&num))!=1)
          {
    printf("\n\n%20s\n\n\n","Invalid
                     input!!!");
     return 1;
          }
       else
        if (num >2 ) {break;}
                   }
     if ((is_prime (num))==yes)
       {
    printf("\n\n%15d%5s\n%5d%3s
                 %3d\n\n\n",num,
             " is a prime number");
       }
      else
       {
    printf("\n\n%15d%5s\n\n\n",num,
          " is not a prime number");
      }
     if (num%2==1)
     {
      printf("\n\n%8s\n\n\n",
           "GOLDBACH CONJECTURE:
                        impossible");
        }
      else {
        goldbach_conjecture(num);
         }

       closest_primes (num);

      return 0;
      }

int is_prime (int n1)
 {
             int counter=2;
            while(num%counter!=0)
   {
    ++counter;
          }
    if (counter>=n1)
      return yes;
     return no;
    }
 
   void goldbach_conjecture (int n2)
    {

    printf("\n\n%15s%d%\n20s","The Goldbach
                 conjecture
                   of even number  ",
          n2,"  has to be here");

     return; }


   void closest_primes (int n3)
    {
       printf("\n\n%15s%d\n%20s\n","The calculation of closest primes of   ",
          n3,"   has to be here");
         return;
                }


конкретные функции goldbach_conjecture и
closest_primes... я писал по всякому. Потом просто стёр и вставил цикл while со счётчиком ,который перебирает натуральный ряд и проверяет числа на простоту... всегда получался 0


P.S. По-моему,эту тему лучше перенести в раздел "Студентам"
292
26 декабря 2005 года
Matush
726 / / 14.01.2004
Чего-то не пойму.
Функция is_prime работает.
Но ее было бы лучше сделать такой:

 
Код:
int is_prime (int n1)
{
for(int x=2; x<=sqrt(n1); x++)
    if(n1%x == 0)
        return no;
return yes;
}


P.S. Зачем printf("\n\n%15d%5s\n%5d%3s% - так много выводов чисел, когда выводиш только одно?
10K
26 декабря 2005 года
Maxyman
40 / / 23.12.2005
Цитата:
Originally posted by Matush
Чего-то не пойму.
Функция is_prime работает.
Но ее было бы лучше сделать такой:

 
Код:
int is_prime (int n1)
{
for(int x=2; x<=sqrt(n1); x++)
    if(n1%x == 0)
        return no;
return yes;
}


 
Код:
int is_prime (int n1)
 {
 int counter=2;
 while(num%counter!=0)
   { ++counter; }
    if (counter>=n1)
      return yes;
     return no;
    }


P.S. Зачем printf("\n\n%15d%5s\n%5d%3s% - так много выводов чисел, когда выводишь только одно?



спасибо большое....твой варианьт гораздо красивее
насчёт принтф,просто я немножко "подстриг" текст,но не всё убрал,похоже....

но всё-таки остаётся вопрос,почему функция не работает при её вызове из других функций,кроме мэйн ? Да ладно уж...

292
26 декабря 2005 года
Matush
726 / / 14.01.2004
Цитата:
Originally posted by Maxyman
но всё-таки остаётся вопрос,почему функция не работает при её вызове из других функций,кроме мэйн ? Да ладно уж...



Как это не работает?
Приведи небольшой кусок кода в котором моя вышепреведенная функция будет давать неверный результат.

252
27 декабря 2005 года
koderAlex
1.4K / / 07.09.2005
лучше делить не на все числа , а на найденные ранее простые.
292
27 декабря 2005 года
Matush
726 / / 14.01.2004
Цитата:
Originally posted by koderAlex
лучше делить не на все числа , а на найденные ранее простые.


Ну для этого надо эти числа иметь.
Функция int is_prime(int); - как можем судить из ее названия, служит для проверки конкретного числа на простоту.

Но если Тебя это немного успокоит, вот в два раза облегченная версия:

Код:
int is_prime (int n1)
{
if(n1%2 == 0)
    return no;
for(int x=3; x<=sqrt(n1); x+=2)
{
    if(n1%x == 0)
        return no;
}
return yes;
}
10K
27 декабря 2005 года
Maxyman
40 / / 23.12.2005
Цитата:
Originally posted by Matush
Как это не работает?
Приведи небольшой кусок кода в котором моя вышепреведенная функция будет давать неверный результат.



Функция goldbach_conjecture,которая, в соответствии с гипотезой Гольдбаха,что любое чётное число можно представить в форме двух простых слагаемых, должна искать эти самые слагаемые:

 
Код:
void goldbach_conjecture (int n2)
    {
       int k;
       
    for (k=2;k==n2/2;k++)
     if (is_prime(k)==yes && is_prime(n3-k) ==yes)
      { printf("\n\n%15s\n%3d%3s%3d%3s\n",
         "The Goldbach Conjecture: ",n3,"=",k,"+",n3-k);  }

     return; }
10K
27 декабря 2005 года
Maxyman
40 / / 23.12.2005
for (k=2;k==n2/2;k++)
if (is_prime(k)==yes && is_prime(n3-k) ==yes)


САмое интересное,что я самыми разными способами пытаюсь сделать цикл типа:
 
Код:
к=2
a=n2-k
выполнять цикл пока к>a или к<n/2 /*неважно в принципе*/
действие
к++


И этот цикл ни разу не запускается(кроме do...while,где он один раз исполняется),вот хоть убей,ошибку не нахожу
6.3K
28 декабря 2005 года
Neutral
76 / / 13.12.2005
Цитата:
Originally posted by Maxyman
Нужен алгоритм или программа на С по отысканию простых чисел не больше данного и по проверке данного числа на простоту

Если вопрос глупый и избитый,дайте ссылочку на соответствующий источник



Ты можешь четко сформулировать что тебе нужно? Тебе два варианта показали (исходники) - правильные. Что тебе нужно сделать?

10K
28 декабря 2005 года
Maxyman
40 / / 23.12.2005
Цитата:
Originally posted by Neutral
Ты можешь четко сформулировать что тебе нужно? Тебе два варианта показали (исходники) - правильные. Что тебе нужно сделать?



Я-чайник и хотел сделать самостоятельно,или хотя бы с чьей-то помощью,чтоб хоть что-то уметь,
но,если интересно,то задание следующее:

1. Вводится число,проверяется на простоту.(с этим справился)
2.Если число составное,разложить на простые множители(с этим справился без использования первой функции)
3.Если число чётное-найти все варианты разложения на 2 простых слагаемых(гипотеза Гольдбаха).
4 И,наконец,найти ближайшие к данному числу простые числа сверху и снизу.

"3" и "4" пытался делать с помощью "1" и ничего не выходит.
В четвёртом варианте либо ничего не получалось,либо выводилось 2 числа-одно наединицу больше.другое на единицу меньше,либо зацикливалось всё...

252
28 декабря 2005 года
koderAlex
1.4K / / 07.09.2005
Цитата:
Originally posted by Maxyman
Я-чайник и хотел сделать самостоятельно,или хотя бы с чьей-то помощью,чтоб хоть что-то уметь,
но,если интересно,то задание следующее:

1. Вводится число,проверяется на простоту.(с этим справился)
2.Если число составное,разложить на простые множители(с этим справился без использования первой функции)
3.Если число чётное-найти все варианты разложения на 2 простых слагаемых(гипотеза Гольдбаха).
4 И,наконец,найти ближайшие к данному числу простые числа сверху и снизу.

"3" и "4" пытался делать с помощью "1" и ничего не выходит.
В четвёртом варианте либо ничего не получалось,либо выводилось 2 числа-одно наединицу больше.другое на единицу меньше,либо зацикливалось всё...



ему всё равно массив простых чисел удобнее иметь .

6.3K
28 декабря 2005 года
Neutral
76 / / 13.12.2005
Цитата:
Originally posted by Maxyman
Я-чайник и хотел сделать самостоятельно,или хотя бы с чьей-то помощью,чтоб хоть что-то уметь,
но,если интересно,то задание следующее:

1. Вводится число,проверяется на простоту.(с этим справился)
2.Если число составное,разложить на простые множители(с этим справился без использования первой функции)
3.Если число чётное-найти все варианты разложения на 2 простых слагаемых(гипотеза Гольдбаха).
4 И,наконец,найти ближайшие к данному числу простые числа сверху и снизу.

"3" и "4" пытался делать с помощью "1" и ничего не выходит.
В четвёртом варианте либо ничего не получалось,либо выводилось 2 числа-одно наединицу больше.другое на единицу меньше,либо зацикливалось всё...



3. Ну тебе нужно либо завести масив простых либо просто проверять все пары(будет долго работать).
4. Как мне кажеться лучше идти вправо и влево от того числа и проверять.
Если надо могу написать реализацию всего, как я понял тебе на C надо.

10K
28 декабря 2005 года
Maxyman
40 / / 23.12.2005
Цитата:
Originally posted by Neutral
3. Ну тебе нужно либо завести масив простых либо просто проверять все пары(будет долго работать).
4. Как мне кажеться лучше идти вправо и влево от того числа и проверять.
Если надо могу написать реализацию всего, как я понял тебе на C надо.



дай пожалуйста,а то у меня 4-я и 3-я функции,вообще не работают

10K
28 декабря 2005 года
Maxyman
40 / / 23.12.2005
Цитата:
Originally posted by Maxyman
[
 
Код:
void goldbach_conjecture (int n2)
    {
       int k;
       
    for (k=2;k==n2/2;k++)
     if (is_prime(k)==yes && is_prime(n3-k) ==yes)
      { printf("\n\n%15s\n%3d%3s%3d%3s\n",
         "The Goldbach Conjecture: ",n3,"=",k,"+",n3-k);  }

     return; }



И скажите ещё,пожалуйста,почему этот цикл не работает,при условии,что is_prime(int n2)написана правильно

6.3K
29 декабря 2005 года
Neutral
76 / / 13.12.2005
Цитата:
Originally posted by Maxyman
Я-чайник и хотел сделать самостоятельно,или хотя бы с чьей-то помощью,чтоб хоть что-то уметь,
но,если интересно,то задание следующее:

1. Вводится число,проверяется на простоту.(с этим справился)
2.Если число составное,разложить на простые множители(с этим справился без использования первой функции)
3.Если число чётное-найти все варианты разложения на 2 простых слагаемых(гипотеза Гольдбаха).
4 И,наконец,найти ближайшие к данному числу простые числа сверху и снизу.

"3" и "4" пытался делать с помощью "1" и ничего не выходит.
В четвёртом варианте либо ничего не получалось,либо выводилось 2 числа-одно наединицу больше.другое на единицу меньше,либо зацикливалось всё...



Вот как приблизительно могло выглядеть решение:
#include <stdio.h>
#include <math.h>

int is_prime(int x)
{
int i;
if (x<2) return 0;
if (x==2) return 1;
if ((x%2==0) && (x!=2)) return 0;
else
{
for (i=3; i<=(int)(sqrt(x)); i+=2)
{
if (x%i==0) return 0;
}
}
return 1;
}

void canon(int x)
{
if (x<2) return;
int q=x,c=3,stc=0;
while (q%2==0) {stc++; q=q/2;}
if (stc!=0) printf("2^%d",stc);
if ((q!=1) && (stc!=0)) printf("*");

while (q!=1)
{
stc=0;
while (q%c==0) {stc++; q=q/c;}
if (stc!=0) printf("%d^%d",c,stc);
if ((q!=1) && (stc!=0)) printf("*");
c+=2;
}
printf("\n");
}

void goltdbah(int x)
{
if (x<2) return;
int i;
if (is_prime(x-2)) printf("2 %d\n",x-2);
for (i=3; i<=x/2; i+=2)
{
if (is_prime(i) && is_prime(x-i)) printf("%d %d\n",i,x-i);
}
}

void near_prn(int x)
{
if (x<2)
{
printf("Bigger prime - 2\n");
printf("Smaller prime - none\n");
return;
}
if (x==2)
{
printf("Bigger prime - 3\n");
printf("Smaller prime - none\n");
return;
}
int i,bigger=0,smaller=0;
for (i=1; (!bigger || !smaller); i++)
{
if (is_prime(x-i)==1) smaller=x-i;
if (is_prime(x+i)==1) bigger=x+i;
}
printf("Bigger prime - %d\n",bigger);
printf("Smaller prime - %d\n",smaller);
}

int main()
{
int n;
printf("Input number:\n");
scanf("%d",&n);
if (is_prime(n)) printf("Yes, %d - is prime\n",n); else printf("No, %d - is not prime\n",n);
if (is_prime(n)==0) canon(n);
if (n%2==0) goltdbah(n);
near_prn(n);
}

Вроде все просто и понятно, но если есть вопросы - пиши отвечу. Удачи!

10K
29 декабря 2005 года
Maxyman
40 / / 23.12.2005
Цитата:
Originally posted by Neutral
Вот как приблизительно могло выглядеть решение:

Вроде все просто и понятно, но если есть вопросы - пиши отвечу. Удачи!



спасибо,у меня примерно тоже самое.
Скомпилирую,проверю на работоспособность и буду сравнивать в чём разница

831
30 декабря 2005 года
S_T
117 / / 23.10.2002
Цитата:
Originally posted by Maxyman
И скажите ещё,пожалуйста,почему этот цикл не работает,при условии,что is_prime(int n2)написана правильно


Ну так, внимательнее надо быть.
Что то мне не очень нравится выражение в for - "k==n2/2". Из за него для всех n2 кроме 4 цикл точно ни разу не выполнится.
Далее, по тексту присутствует n3. Это что? Глобальная переменная или опечатка? Может там все-таки n2?

10K
30 декабря 2005 года
Maxyman
40 / / 23.12.2005
Цитата:
Originally posted by Maxyman
И скажите ещё,пожалуйста,почему этот цикл не работает,при условии,что is_prime(int n2)написана правильно


== опечатка,а n3-глобальная опечатка...
спасибо...

Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог