Печать чисел от 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;
}
на самом деле лучшее решение-использовать "простое сито или сито простых чисел", которое "является быстрым типом алгоритма поиска простых чисел" .. Википедия
простой (но не более быстрый) алгоритм называется "ситом Эратосфена" и может быть выполнен в следующих шагах(снова из Википедии):
- создать список последовательных чисел от 2 до N: (2, 3, 4, ..., северный.)
- первоначально пусть p равно 2, первое простое число.
- начиная с p, подсчитайте с шагом p и отметьте каждое из этих чисел больше, чем p само по себе в списке. Эти цифры будут 2p, 3p, 4p, etc.; обратите внимание, что некоторые из них уже были отмечены.
- найдите первое число больше 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.