it-swarm.com.ru

Печать простых чисел от 1 до 100

Этот код C++ выводит следующие простые числа: 3 5 7 11 13 17 19 23 29 31 37 41 43 47 53 59 61 67 71 73 79 83 89 97.

Но я не думаю, что именно так моя книга хочет, чтобы она была написана. Здесь упоминается кое-что о квадратном корне числа. Поэтому я попытался изменить свой второй цикл на for (int j=2; j<sqrt(i); j++), но он не дал мне нужного результата.

Как мне нужно изменить этот код так, как того хочет моя книга?

int main () 
{
    for (int i=2; i<100; i++) 
        for (int j=2; j<i; j++)
        {
            if (i % j == 0) 
                break;
            else if (i == j+1)
                cout << i << " ";

        }   
    return 0;
}

Простое целое число - это число, которое имеет ровно два разных делителя, а именно 1 и сам номер. Написать, запустить и протестировать программу на C++, которая находит и печатает все простые числа меньше 100. (Подсказка: 1 - это простое число Число. Для каждого числа от 2 до 100 find Remainder = Number% n, где n колеблется от 2 до sqrt (число).\If n больше, чем sqrt (число), число не делится поровну на n. Почему? Если какой-либо остаток равен 0, номер не является простым числом.)

12
Sahat Yalkabov

Три способа:

1.

int main () 
{
    for (int i=2; i<100; i++) 
        for (int j=2; j*j<=i; j++)
        {
            if (i % j == 0) 
                break;
            else if (j+1 > sqrt(i)) {
                cout << i << " ";

            }

        }   

    return 0;
}

2.

int main () 
{
    for (int i=2; i<100; i++) 
    {
        bool prime=true;
        for (int j=2; j*j<=i; j++)
        {
            if (i % j == 0) 
            {
                prime=false;
                break;    
            }
        }   
        if(prime) cout << i << " ";
    }
    return 0;
}

3.

#include <vector>
int main()
{
    std::vector<int> primes;
    primes.Push_back(2);
    for(int i=3; i < 100; i++)
    {
        bool prime=true;
        for(int j=0;j<primes.size() && primes[j]*primes[j] <= i;j++)
        {
            if(i % primes[j] == 0)
            {
                prime=false;
                break;
            }
        }
        if(prime) 
        {
            primes.Push_back(i);
            cout << i << " ";
        }
    }

    return 0;
}

Правка: в третьем примере мы отслеживаем все наши ранее вычисленные простые числа. Если число делится на не простое число, существует также некоторый простой <= тот делитель, на который он также делится. Это уменьшает вычисления на коэффициент primes_in_range/total_range.

27
ProdigySim

Если j равен равно sqrt(i), это также может быть допустимым фактором, не только если он меньше .

Чтобы выполнить итерацию вплоть до sqrt(i) во внутреннем цикле, вы можете написать:

for (int j=2; j*j<=i; j++)

(По сравнению с использованием sqrt(i) это имеет то преимущество, что не требует преобразования в числа с плавающей запятой.) 

15
sth

Если число имеет делители, по крайней мере один из них должен быть меньше или равен квадратному корню из числа. Когда вы проверяете делители, вам нужно проверять только квадратный корень, а не только проверяемое число.

11
Jerry Coffin

Это моя очень простая программа на с ++ для перечисления простых чисел от 2 до 100.

for(int j=2;j<=100;++j)
{
    int i=2;
    for(;i<=j-1;i++)
    {
        if(j%i == 0)
            break;
    }

    if(i==j && i != 2)
        cout<<j<<endl;
}
8
Carthi

на самом деле лучшее решение состоит в том, чтобы использовать «простое сито или простое число», которое «является быстрым типом алгоритма для поиска простых чисел» .. wikipedia

Простой (но не более быстрый) алгоритм называется «решето из эратосфена» и может быть выполнен в следующих шагах (снова из Википедии):

  1. Создайте список последовательных целых чисел от 2 до n: (2, 3, 4, ..., n).
  2. Первоначально, пусть p равно 2, первое простое число.
  3. Начиная с p, посчитайте с шагом p и отметьте каждое из этих чисел больше, чем само p в списке. Эти цифры будут 2р, 3р, 4р и т.д .; обратите внимание, что некоторые из них, возможно, уже были отмечены.
  4. Найдите первое число больше p в списке, который не отмечен. Если такого номера не было, остановитесь. В противном случае, пусть p теперь равно этот номер (который является следующим простым), и повторите с шага 3.
4
fady mohamed osman

Используя Sieve of Eratosthenes logic, я могу достичь тех же результатов с гораздо более быстрой скоростью.

Мой код демо VS принятый ответ

Сравнение count, Моему коду требует значительно меньших итераций для завершения работы. Проверьте результаты для различных значений N в конце.

Почему этот код работает лучше, чем уже принятые:

- четные числа не проверяются ни разу на протяжении всего процесса.

- внутренние и внешние циклы проверяются только в допустимых пределах. Никаких посторонних проверок.

Код:

int N = 1000; //Print primes number from 1 to N
vector<bool> primes(N, true);
for(int i = 3; i*i < N; i += 2){    //Jump of 2
    for(int j = 3; j*i < N; j+=2){  //Again, jump of 2
        primes[j*i] = false;
    }
}
if(N >= 2) cout << "2 ";
for(int i = 3; i < N; i+=2){        //Again, jump of 2
    if(primes[i] == true) cout << i << " "; 
}

Для N = 1000 мой код занимает 1166 итераций, принятый ответ - 5287 (в 4,5 раза медленнее)

Для N = 10000 мой код занимает 14637 итераций, принятый ответ - 117526 (в 8 раз медленнее)

Для N = 100000 мой код занимает 175491 итераций, принятый ответ - 2745693 (в 15,6 раз медленнее)

4
Saurav Sahu

Найти простые числа до 100 особенно приятно и просто:

    printf("2 3 ");                        // first two primes are 2 and 3
    int m5 = 25, m7 = 49, i = 5, d = 4;
    for( ; i < 25; i += (d=6-d) )
    {
        printf("%d ", i);                  // all 6-coprimes below 5*5 are prime
    }
    for( ; i < 49; i += (d=6-d) )
    {
        if( i != m5) printf("%d ", i);
        if( m5 <= i ) m5 += 10;            // no multiples of 5 below 7*7 allowed!
    }
    for( ; i < 100; i += (d=6-d) )         // from 49 to 100,
    {
        if( i != m5 && i != m7) printf("%d ", i);
        if( m5 <= i ) m5 += 10;            //   sieve by multiples of 5,
        if( m7 <= i ) m7 += 14;            //                       and 7, too
    }

Квадратный корень из 100 равен 10, поэтому в этом представлении сита Эратосфена с колесом 2-3 используются кратные только простых чисел выше 3, которые не больше 10 - а именно 5 и 7 одни! - просеивать 6 -кримы ниже 100 в пошаговом режиме.

3
Will Ness

Можно изменить цикл for на for (int j=2; j<=sqrt(i); j++), но вам также нужно изменить что-то еще. Смотря конкретно на ваше состояние печати, 

else if (i == j+1) {
      cout << i << " ";
}

почему это никогда не сработает, если вы перебираете только до sqrt(i)? Куда вы можете переместить cout, чтобы изменить это? (Подсказка: вы можете переместить печать из цикла, а затем использовать переменные типа флага)

2
Jesse Cohen

Я проверяю, является ли число простым или нет, с помощью следующего кода (конечно, используя sqrt):

bool IsPrime(const unsigned int x)
{
  const unsigned int TOP
  = static_cast<int>(
      std::sqrt( static_cast<double>( x ) )
    ) + 1;

  for ( int i=2; i != TOP; ++i )
  {
    if (x % i == 0) return false;
  }
  return true;
}

Я использую этот метод для определения простых чисел:

#include <iostream>

using std::cout;
using std::cin;
using std::endl;

#include <cmath>

void initialize( unsigned int *, const unsigned int );
void show_list( const unsigned int *, const unsigned int );
void criba( unsigned int *, const unsigned int );
void setItem ( unsigned int *, const unsigned int, const unsigned int );

bool IsPrime(const unsigned int x)
{
  const unsigned int TOP
  = static_cast<int>(
      std::sqrt( static_cast<double>( x ) )
    ) + 1;

  for ( int i=2; i != TOP; ++i )
  {
    if (x % i == 0) return false;
  }
  return true;
}

int main()
{

    unsigned int *l;
    unsigned int n;

    cout << "Ingrese tope de criba" << endl;
    cin >> n;

    l = new unsigned int[n];

    initialize( l, n );

    cout << "Esta es la lista" << endl;
    show_list( l, n );

    criba( l, n );  

    cout << "Estos son los primos" << endl;
    show_list( l, n );
}

void initialize( unsigned int *l, const unsigned int n)
{
    for( int i = 0; i < n - 1; i++ )
        *( l + i ) = i + 2;
}

void show_list( const unsigned int *l, const unsigned int n)
{
    for( int i = 0; i < n - 1; i++ )
    {
        if( *( l + i ) != 0)
            cout << l[i] << " - ";
    }
    cout << endl;
}

void setItem( unsigned int *l, const unsigned int n, const unsigned int p)
{
    unsigned int i = 2;
    while( p * i <= n)
    {
        *( l + (i * p - 2) ) = 0;
        i++;
    }
}

void criba( unsigned int *l, const unsigned int n)
{
    for( int i = 0;  i * i <= n ; i++ )
     if( IsPrime ( *( l + i) ) )
        setItem( l, n, *(l + i) );      
}
2
fpointbin

вот простой код для печати всех простых чисел до заданного числа n,

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

void main()
{
clrscr();
int n,i,j,k;
cout<<"Enter n\n";
cin>>n;

for(i=1;i<=n;i++)
{   k=0;
  for(j=1;j<=i;j++)
  {
    if((i%j)==0)
    k++;
   }
  if(k==2)
  cout<<i<<endl;
}
getch();
}
0
palslav

Я всегда использую это (это легко и быстро):

#include <iostream>
using namespace std;

int i,j;
bool b[101];

int main( )
{
    for(i=2;i<101;i++){
        b[i]=true;
    }
    for(i=1;i<101;i++){
        if(b[i]){
            cout<<i<<" ";
            for(j=i*2;j<101;j+=i) b[j]=false;
        }
    }
}

Вот вывод этого кода: 2 3 5 7 11 13 17 19 23 29 31 37 41 43 47 53 59 61 67 71 73 79 83 89 97

0
Guiorgy

Книга, кажется, "C++ для инженеров и ученых" Написанная Гэри Бронсон (гуглил это).
Это возможный ответ? ИМХО это удивительно.

Я должен был прочитать вопрос (из книги) несколько раз. Моя интерпретация:
Для каждого числа N: 2 <= N <100 проверьте, является ли оно простым.
Как? Для каждого делителя D: 2 <= D <sqrt (N),
если D делит N, N не простое число, если D> sqrt (N), N простое число.

Попробуйте: 

N = 2, sqrt(2) ≈ 1.41, D = 2, 2 < 1.41 ?  no 2 > 1.41 ? yes 2 is prime.  
N = 3, sqrt(3) ≈ 1.73, D = 2, 2 < 1.73 ?  no 2 > 1.73 ? yes 3 is prime.  
N = 4, sqrt(4) = 2.00, D = 2, 2 < 2.00 ?  no 2 > 2.00 ?  no 4 is not prime.  
N = 5, sqrt(5) ≈ 2.24, D = 2, 2 < 2.24 ? yes 5 % 2 > 0? yes  
                       D = 3, 3 < 2.24 ?  no 3 > 2.24 ? yes 5 is prime.    
N = 6, sqrt(6) ≈ 2.45, D = 2, 2 < 2.45 ? yes 6 % 2 = 0  2 > 2.45 ? no 6 is not prime.

Насколько я вижу, вот как должны быть найдены простые числа,
не с ситом (намного, намного быстрее),
но с: ответ в вопросе! Удивительно?

Скорость? простые числа <400 000: менее 10 секунд (на моих часах, rolex, я купил их на рынке, продавец сказал, что это был настоящий, настоящий по цене двух багетов с 12 настоящими бриллиантами).
Давайте посчитаем простые числа (я не собираюсь показывать код;): 664579 простых чисел <10 000 000: 5 секунд.

#include "stdafx.h"
#include <math.h>
#include <iostream>
using namespace std;
int main()
{
    double rt;
    for (int d = 2, n = 2; n < 100; d = 2, n++)
    {
        for (rt = sqrt(n); d < rt; d++)
            if (n % d == 0) break;
        if (d > rt) cout << n << " ";
    }
    getchar();  // 25 primes :-)
}

Удалил более ранний ответ с (как и другие ответы) премьер-ситом.
Надеюсь, скоро я получу свой следующий значок "Некромант". 

Я спросил автора: в вашей книге: «C++ для E & S» Это упражнение о простых числах, [xrcs] ... [/ xrcs] . Семь лет назад его спросили по адресу: SO/q/5200879
Несколько дней назад я дал ответ: SO/a/49199435
Как вы думаете, это разумное решение, или, возможно, решение.

Он ответил: «Питер, у меня никогда не было конкретного решения». Когда я составляю упражнения,
поэтому я не могу сказать, что я имел в виду ваше точное решение .. Радость C++ заключается в том, что можно придумать действительно креативные решения и отличный код, так как, на первый взгляд, это выглядит так ты сделал.
Спасибо за отправку!
Д-р. Bronson

Я пошел в https://youtu.be/1175axY2Vvw

PS. Сито: https://Pastebin.com/JMdTxbeJ

0
P_P

Чтобы найти, нет ли. прост или нет C++: 

#include<iostream>
#include<cmath>

using namespace std;
int main(){

int n, counter=0;

cout <<"Enter a number to check whether it is prime or not \n";
cin>>n;

  for(int i=2; i<=n-1;i++) {
    if (n%i==0) {
      cout<<n<<" is NOT a prime number \n";
      break;
    }
    counter++;
                }
    //cout<<"Value n is "<<n<<endl;
    //cout << "number of times counter run is "<<counter << endl;
    if (counter == n-2)
      cout << n<< " is prime \n";
   return 0;
}
0
Sdembla

Простая программа для печати "N" простых чисел. Вы можете использовать значение N как 100.

    #include  <iostream >
    using  namespace  std;

    int  main()
    {
        int  N;
        cin  >>  N;
        for (int  i =  2;  N > 0;  ++i)
        {
            bool  isPrime  =  true ;
            for (int  j =  2;  j < i;  ++j)
            {
                if (i  % j ==  0)
                {
                    isPrime  =  false ;
                    break ;
                }
            }
            if (isPrime)
            {
                --N;
                cout  <<  i  <<  "\n";
            }
        }
        return  0;
    }
0
Dineshkumar Ponnusamy
#include<iostream>
using namespace std;
void main()
{
        int num,i,j,prime;
    cout<<"Enter the upper limit :";
    cin>>num;
    cout<<"Prime numbers till "<<num<<" are :2, ";

    for(i=3;i<=num;i++)
    {
        prime=1;
        for(j=2;j<i;j++)
        {
            if(i%j==0)
            {
                prime=0;
                break;
            }
        }
        if(prime==1)
            cout<<i<<", ";
    }
}
0
Gaurav

это мой подход из простого блога:

//Prime Numbers generation in C++
//Using for loops and conditional structures
#include <iostream>
using namespace std;

int main()
{
int a = 2;       //start from 2
long long int b = 1000;     //ends at 1000

for (int i = a; i <= b; i++)
{

 for (int j = 2; j <= i; j++)
 {
    if (!(i%j)&&(i!=j))    //Condition for not prime
        {
            break;
        }

    if (j==i)             //condition for Prime Numbers
        {
              cout << i << endl;

        }
 }
}
}

- См. Больше на: http://www.programmingtunes.com/generation-of-prime-numbers-c/#sthash.YoWHqYcm.dpuf

0
user2808359
#include "stdafx.h"
#include<iostream>
using namespace std;
void main()
{ int f =0;
 for(int i=2;i<=100;i++)
  {
   f=0;
   for(int j=2;j<=i/2;j++)
   { 
     if(i%j==0)
     { f=1;
       break;
     }
   }
 if (f==0)
  cout<<i<<" ";
}
 system("pause");
}
0
Mohsin

Вот моя реализация сита Эратосфена (для простых чисел между 2 и n)

#include <iostream>

int main (){
int n=0;
std::cout << "n = ";
std::cin >> n;
std::cout << std::endl;

if (n==0 || n==1){
    std::cout << "No primes in this range" << std::endl;
    return 0;
}


const int array_len = n-2+1;

int the_int_array[array_len];
for (int counter=2; counter <=n; counter++)
    the_int_array[counter-2]=counter;


int runner = 0;
int new_runner = 0;

while (runner < array_len ){
    if (the_int_array[runner]!=0){
        new_runner = runner;
        new_runner = new_runner + the_int_array[runner];

        while (new_runner < array_len){
           the_int_array[new_runner] = 0;
           new_runner = (new_runner + the_int_array[runner]);
        }
    }
runner++;
}

runner = 0;

while (runner < array_len ){
    if (the_int_array[runner]!=0)
        std::cout << the_int_array[runner] << " ";
    runner++;
}

std::cout << std::endl;
return 0;

}

0
pravish

Использование правил делимости простых чисел можно найти в O(n), и это действительно эффективно Правила делимости

Решение будет основано на отдельных цифрах числа ... 

0
NirmalGeo

Я сделал это в Perl, основываясь на самом популярном ответе второго метода ProdigySim. Мне пришлось добавить эквивалент break в Perl, last, сразу после print $i . " \n";, чтобы избежать вывода простых чисел дважды.

#!/bin/Perl
use strict;

for(my $i=2; $i < 100; $i++){

    my $prime = 1;

    for (my $j=2; $j*$j<=$i; $j++){
        if ($i % $j == 0){
            $prime = 0;
            last;
        }
        if($prime) {
            print $i . " \n";
            last;
        }
    }

}
0
CoffeeAtBedtime