Печать чисел от 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, найти остаток = число % n, где N колеблется от 2 до sqrt(число). If n больше, чем sqrt (число), число не делится поровну на n. Почему? Если остаток равен 0, то число не простое число.)

21 ответов


тремя способами:

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;
}

Edit: в третьем примере мы отслеживаем все наши ранее вычисленные простые числа. Если число делится на не простое число, существует также некоторый простой


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

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

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

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


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


Это моя очень простая программа C++ для перечисления простых чисел между 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;
}

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

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

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

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

мой код демо 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 раза медленнее)


поиск простых чисел до 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 is 10 и так это исполнение решето Эратосфена С 2-3 колеса использует кратные только простых чисел выше 3 что не превышает 10 -- именно. 5 и 7! -- просеять 6-coprimes ниже 100 постепенно.


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

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

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


Я проверяю, является ли число простым или нет со следующим кодом (конечно, используя 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) );      
}

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

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


#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<<", ";
    }
}

вот моя реализация сита Эратосфена (для простых чисел между 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;

}


#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");
}

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

//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


чтобы узнать, нет ли. является простым или нет 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;
}

Я сделал это в perl на основе самого популярного ответа 2-м методом 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;
        }
    }

}

простая программа для печати" 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;
    }

вот простой код для печати всех простых чисел до заданного числа 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();
}

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

#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


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

мне пришлось прочитать вопрос (из книги) несколько раз. Моя интерпретация:
Для каждого число N: 2 Как? Для каждого делитель D: 2 если 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.

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

скорость? простые числа Давайте посчитаем простые числа (я не собираюсь показывать код ;) : 664579 простых чисел

#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++ заключается в том, что можно придумать действительно творческие решения и отличный код, как, на первый взгляд, вы и сделали.
Спасибо!
Доктор Бронсон!--4-->

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

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


просто попробуйте это. Это легко без каких-либо дополнительных встроенных функций.

#include <iostream>

int prime(int n,int r){

  for(int i=2;n<=r;i++){
    if(i==2 || i==3 || i==5 || i==7){
      std::cout<<i<<" ";
      n++;
    } else if(i%2==0 || i%3==0 || i%5==0 || i%7==0)
      continue;
    else {
      std::cout<<i<<" ";
      n++;
    }
  }

}

main(){

  prime(1,25);
}

тестирование 2,3,5,7 это достаточно хорошо для 120, так что 100 ОК.

здесь 25 простые числа ниже 100, an 30 ниже 121 = 11*11.