Продолжаю изучать С++
От: Deposit Россия  
Дата: 14.10.05 08:14
Оценка: 9 (1) :))) :))) :))) :))
Делаю задание, в котором надо написать функцию, которая проверяет является ли данное число простым (простое число- число которое делится без остатка только на себя и 1. 7, 11 и тд.)
Правильно ли организаван цикл проверки? И какого то условия не хватает?

#include <stdio.h>
#include <conio.h>
#include <iostream.h>

int Proverka(int num)
{
if (num/num != 1) 
if (num != num/1) 
return printf("%d\n Число простое\n",num);
else
return printf("\n Error");
}

int main()
 {
  clrscr();
   int My_num;
    cout << "Введите любое число от 1 до бесконечности \n";
    cout << "My_num= ";
    cin >> My_num;
  Proverka(My_num);
 return 0;
 }
Re: Продолжаю изучать С++
От: LuciferMoscow Россия  
Дата: 14.10.05 08:20
Оценка:
Здравствуйте, Deposit, Вы писали:

D>Делаю задание, в котором надо написать функцию, которая проверяет является ли данное число простым (простое число- число которое делится без остатка только на себя и 1. 7, 11 и тд.)

D>Правильно ли организаван цикл проверки? И какого то условия не хватает?
Я там цикла не увидел...
Re: Продолжаю изучать С++
От: HiSH Россия http://m0riarty.ya.ru
Дата: 14.10.05 08:20
Оценка:
Здравствуйте, Deposit, Вы писали:

D>Делаю задание, в котором надо написать функцию, которая проверяет является ли данное число простым (простое число- число которое делится без остатка только на себя и 1. 7, 11 и тд.)

D>Правильно ли организаван цикл проверки? И какого то условия не хватает?

D>
D>if (num/num != 1) 
D>if (num != num/1) 
D>


Эээ... а где тут цикл? Эти два условия будут всегда неверны: x / x == 1 и x == x / 1 для любых целых чисел
Re: Продолжаю изучать С++
От: Bell Россия  
Дата: 14.10.05 08:23
Оценка:
Здравствуйте, Deposit, Вы писали:

D>Делаю задание, в котором надо написать функцию, которая проверяет является ли данное число простым (простое число- число которое делится без остатка только на себя и 1. 7, 11 и тд.)

D>Правильно ли организаван цикл проверки?
Что-то я не вижу никакого цикла в приведенном коде...

D>И какого то условия не хватает?


D>
D>int Proverka(int num)
D>{
D>if (num/num != 1) 
D>if (num != num/1) 
D>return printf("%d\n Число простое\n",num);
D>else
D>return printf("\n Error");
D>}

D>

Выделенная строка эквивалентна вот такой:
if(false)

т.е. условие всегда будет давать false.
Второе: вопрос на засыпку: к какому if относится else в функции Proverka?
Третье: какой собственно алгоритм предпологается использовать для проверки простоты?

ЗЫ
Любое число делится на себя и на еденицу без остатка...
Любите книгу — источник знаний (с) М.Горький
Re: Продолжаю изучать С++
От: Death_Mokar Украина  
Дата: 14.10.05 08:33
Оценка:
Контрольные примеры проганял?..
улыбок тебе дед мокар
Re: Продолжаю изучать С++
От: Нахлобуч Великобритания https://hglabhq.com
Дата: 14.10.05 08:33
Оценка:
Здравствуйте, Deposit, Вы писали:

D>Делаю задание, в котором надо написать функцию, которая проверяет является ли данное число простым (простое число- число которое делится без остатка только на себя и 1. 7, 11 и тд.)

D>Правильно ли организаван цикл проверки? И какого то условия не хватает?

Давай понамекаю

#include <stdio.h>
#include <conio.h>
#include <iostream.h>

// Есть ли смысл возвращать int (тем более не результат проверки, а
// результат вызова printf? К тому же, зачем printf когда ниже
// используется count/cin
// Предлагаю так:
bool is_prime(int value);

int Proverka(int num)
{
// Как уже сказали, цикла тут не видно. Самый простой вариант - цикл от 2 до num 
// и подсчет количества делителей. Небольшая оптимизация - цикл от 2 и до
// кадратного корня из num и опять же подсчет делителй.
if (num/num != 1) 
if (num != num/1) 
return printf("%d\n Число простое\n",num);
else
return printf("\n Error");
}

int main()
 {
  clrscr();
   int My_num;
    cout << "Введите любое число от 1 до бесконечности \n";
    cout << "My_num= ";
    cin >> My_num;
  Proverka(My_num);
 return 0;
 }
... << RSDN@Home 1.1.4 stable SR1 rev. 568>>
HgLab: Mercurial Server and Repository Management for Windows
Re: Продолжаю изучать С++
От: Vutik  
Дата: 14.10.05 08:37
Оценка: +2
Сначала нада математику выучить
Re: Продолжаю изучать С++
От: Аноним  
Дата: 14.10.05 08:45
Оценка:
Вот нужная тебе функция, алгоритм самый простой:

bool isPrimeNumber (int num)
{
    if (num < 0)
        num = -num;
    for (int i = 2; i < num / 2; i++)
        if (!(num % i))
            return 0;
    return 1;
}


А вообще сначала лучше учи математику
Re[2]: Продолжаю изучать С++
От: Deposit Россия  
Дата: 14.10.05 08:47
Оценка:
Здравствуйте, Bell, Вы писали:

B>Здравствуйте, Deposit, Вы писали:


D>>Делаю задание, в котором надо написать функцию, которая проверяет является ли данное число простым (простое число- число которое делится без остатка только на себя и 1. 7, 11 и тд.)

D>>Правильно ли организаван цикл проверки?
B>Что-то я не вижу никакого цикла в приведенном коде...

D>>И какого то условия не хватает?


D>>
D>>int Proverka(int num)
D>>{
D>>if (num/num != 1) 
D>>if (num != num/1) 
D>>return printf("%d\n Число простое\n",num);
D>>else
D>>return printf("\n Error");
D>>}

D>>

B>Выделенная строка эквивалентна вот такой:
B>
B>if(false)
B>

B>т.е. условие всегда будет давать false.
B>Второе: вопрос на засыпку: к какому if относится else в функции Proverka?
B>Третье: какой собственно алгоритм предпологается использовать для проверки простоты?

B>ЗЫ

B>Любое число делится на себя и на еденицу без остатка...

Какого то условия не хватает, как проверить простое число или нет?
Первые 2 условия должны быть такими наверно
если целое число делится на само себя и делиться на еденицу и (еще какое то условие)
то число простое.
Иначе Ошибка.

А цикла наверно тут и не надо. Условиями достаточно будет обойтись?
D>if (num/num != 1)
D>if (num != num/1)
Как их обьеденить? что бы else относился к обоим if?
Re[3]: Продолжаю изучать С++
От: Bell Россия  
Дата: 14.10.05 09:03
Оценка: +1
Здравствуйте, Deposit, Вы писали:

D>Какого то условия не хватает, как проверить простое число или нет?

Я наверное ужасно старомоден, но по-моему, прежде чем писАть программу, неплохо бы определится — что, и, главное, как она будет делать

D>Первые 2 условия должны быть такими наверно

D>если целое число делится на само себя и делиться на еденицу
да любое число делится не себя (ну кроме нуля) и на еденицу, так что эти проверки абсолютно беcсмысленны.

D>... и (еще какое то условие)

Вот в именно этом "еще каком-то ксловии" и все дело.
Несколько алгоритмов уже предложили. От себя могу добавить один из простейших методов определения простоты — с помощью решета Эратосфена. Что это такое — легко найти в любом учебнике, ну или в сети.

D>>if (num/num != 1)

D>>if (num != num/1)
Пиши с отступами, и со скобочками:

int Proverka(int num)
{
if (num/num != 1) 
{
   if (num != num/1) 
   {
      return printf("%d\n Число простое\n",num);
   }
   else
   {
      return printf("\n Error");
   }
}


D>Как их обьеденить? что бы else относился к обоим if?

Например объединить ксловия в одном if.
Любите книгу — источник знаний (с) М.Горький
Re[2]: Продолжаю изучать С++
От: crable США  
Дата: 14.10.05 09:18
Оценка: +1 :)
Здравствуйте, Аноним, Вы писали:

А>Вот нужная тебе функция, алгоритм самый простой:


А>
А>bool isPrimeNumber (int num)
А>{
А>    if (num < 0)
А>        num = -num;
А>    for (int i = 2; i < num / 2; i++)
А>        if (!(num % i))
А>            return 0;
А>    return 1;
А>}
А>


А>А вообще сначала лучше учи математику

Хм... а что, отрицательные числа тоже могуть простыми? И зачем цикл аж до num/2 если достаточно до корня квадратного из num?
Как, однако, все сложно оказалось...
The last good thing written in C was Franz Schubert's Symphony No. 9.
Re[3]: Продолжаю изучать С++
От: crable США  
Дата: 14.10.05 09:22
Оценка:
Здравствуйте, Deposit, Вы писали:

D>Здравствуйте, Bell, Вы писали:


B>>Здравствуйте, Deposit, Вы писали:


D>>>Делаю задание, в котором надо написать функцию, которая проверяет является ли данное число простым (простое число- число которое делится без остатка только на себя и 1. 7, 11 и тд.)

[snip]
D>Какого то условия не хватает, как проверить простое число или нет?
D>Первые 2 условия должны быть такими наверно
D>если целое число делится на само себя и делиться на еденицу и (еще какое то условие)
D>то число простое.
D>Иначе Ошибка.
Стоит обратить внимание на выделенное слово.
[snip]
The last good thing written in C was Franz Schubert's Symphony No. 9.
Re: Продолжаю изучать С++
От: Vutik  
Дата: 14.10.05 09:22
Оценка: :))) :)
Светлана? Семененко?? Ты уже здесь???!!!!
Re: Продолжаю изучать С++
От: _Winnie Россия C++.freerun
Дата: 14.10.05 09:58
Оценка: 5 (1) :))) :))) :))
Печать простых чисел от 1 до 100. Достаточно легко вытащить из неё просто проверку на простоту.
#include <iostream>
//(c) _Winnie
int P(int p,int i){return i--==p&&p-2&&P(i,i),i<2&&std::cout<<p<<' '||p%i&&P(p,i); }
int main() {  P(100,100); }
Правильно работающая программа — просто частный случай Undefined Behavior
Re[2]: Продолжаю изучать С++
От: _Winnie Россия C++.freerun
Дата: 14.10.05 10:04
Оценка:
Здравствуйте, _Winnie, Вы писали:
_W>Печать простых чисел от 1 до 100.
PS. Это из святой войны "perl vs C++", про то, где можно писать более непонятный код.
Правильно работающая программа — просто частный случай Undefined Behavior
Re[3]: Продолжаю изучать С++
От: Нахлобуч Великобритания https://hglabhq.com
Дата: 14.10.05 10:09
Оценка:
Здравствуйте, _Winnie, Вы писали:

_W>Здравствуйте, _Winnie, Вы писали:

_W>>Печать простых чисел от 1 до 100.
_W>PS. Это из святой войны "perl vs C++", про то, где можно писать более непонятный код.

Как уже вас много
Мсье знает толк в извращениях
... << RSDN@Home 1.1.4 stable SR1 rev. 568>>
HgLab: Mercurial Server and Repository Management for Windows
Re[2]: Продолжаю изучать С++
От: investigator Россия  
Дата: 14.10.05 10:11
Оценка:
Здравствуйте, Аноним, Вы писали:

А>Вот нужная тебе функция, алгоритм самый простой:


А>
А>bool isPrimeNumber (int num)
А>{
А>    if (num < 0)
А>        num = -num;
А>    for (int i = 2; i < num / 2; i++)
А>        if (!(num % i))
А>            return 0;
А>    return 1;
А>}
А>


Только условие в цикле i <= num / 2. Простой контрпример для твоего решения — 4, оно получается простым.
Re[2]: Продолжаю изучать С++
От: Dmi_3 Россия  
Дата: 14.10.05 21:15
Оценка: 3 (1)
Здравствуйте, _Winnie, Вы писали:

_W>Печать простых чисел от 1 до 100. Достаточно легко вытащить из неё просто проверку на простоту.


template<int>struct prime;//Вычисление N-го простого числа    prime<N>::result
template<int>struct is_prime;//Проверка числа на простоту     is_prime<N>::result

template<>struct prime<0>{enum{result=2};};//Число 2 нулевое простое число
template<>struct prime<1>{enum{result=3};};//Число 3 первое простое число
template<>struct prime<2>{enum{result=5};};//Число 5 второе простое число
template<>struct is_prime<0>{};//Число 0 не простое и не составное
template<>struct is_prime<1>{};//Число 1 не простое и не составное
template<>struct is_prime<2>{enum{result=true};};//Число 2 простое
template<>struct is_prime<3>{enum{result=true};};//Число 3 простое

template<int n>
struct is_prime{
  template<int k>
  struct helper{//Вспомогательная структура преобразующая цикл в рекурсию.
    enum{
      tmp=prime<k>::result,
      result=helper<(n<tmp*tmp)?0:(n%tmp?k+1:1)>::result
    };
  };
  template<>struct helper<0>{enum{result=true};};//Выход из цикла - число простое
  template<>struct helper<1>{enum{result=false};};//Выход из цикла - число составное
  enum{
    tmp=n%6,//Все простые числа большие трёх имеют вид 6*N+1 или 6*N+5
    result=helper<((tmp==1)||(tmp==5))+1>::result//Проверим делится ли n на 5 7 11 13 19 23...
  };
};

template<int n,bool>//Вспомогательная структура преобразующая цикл в рекурсию.
struct helper{enum{result=helper<n+2,is_prime<n+2>::result>::result};};
template<int n>
struct helper<n,true>{enum{result=n};};
template<int idx>//Возьмём N-1 простое число и будем прибалять двойку пока не получим новое простое число
struct prime{enum{result=helper<prime<idx-1>::result,false>::result};};


template<int i>
struct program:public program<i-1>{
  program():program<i-1>(){std::cout<<prime<i>::result<<endl;}
};
template<>
struct program<0>{
  program(){std::cout<<prime<0>::result<<endl;}
};

int main(){
  program<100>();
}
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.