ГЛАВА 4. Делители целого числа

Для нахождения всех делителей некоторого натурального числа N, исключая 1 и само число, следует перебрать все натуральные значения от 2 до [ N /2], так как в интервале от [ N /2]+1 до N множителей нет [26]. Здесь [x] – целая часть числа x.

Листинг 4.1. Определить все делителели некоторого натурального числа N, за исключением 1 и самого числа.

//L4_1.cpp

#include <iostream>

using namespace std;

int main()

{

setlocale(LC_CTYPE,"russian");

int n,d;

do // Цикл гарантирует

{ // введение натурального

cout<<"Введите n "; // числа.

cin>>n;

}while (n<=0);

for(d=2;d<=n/2;d++) // Нахождение делителей

{

if(n%d==0)

cout<<d<<" ";

}

cout<<endl;

return 0;

}

Результат работы программы листинга 4.1 приведен на рис. 4.1:

Рис. 4.1. Результат работы программы листинга 4­.1

Следует отметить, что можно искать делители среди натуральных чисел, не превышающих квадратный корень из исходного числа, а остальные делители получаются в результате деления этого числа на найденные делители, то есть цикл «Нахождение делителей» будет иметь следующий заголовок:

for(d=2; d*d<=n; d++).

В этом случае результат работы программы представлен на рис. 4.2.

Рис. 4.2. Результат работы программы листинга 4­.2

Листинг 4.2. Найти наибольший общий делитель (НОД) двух неотрицательных целых чисел m и n, используя алгоритм Евклида [4, 26]. Алгоритм Евклида основывается на том, что для двух чисел m и n, причем m ³ n, НОД(m, n) = НОД(n, r), где r – остаток от деления m на n. Если n = 0, то НОД(m,0)= m.

//L4_2.cpp

#include <iostream>

using namespace std;

int main()

{

setlocale(LC_CTYPE,"russian");

int n,m,r;

do // Цикл гарантирует

{ // введение натуральных

// чисел.

cout<<"Введите натуральные числа m и n ";

cin>>m>>n;

}while (m <= 0 || n <= 0);

if (m < n)

{

r=m;

m=n;

n=r;

}

while (n > 0)

{

r=m % n;

m=n;

n=r;

}

cout<<"Наибольший общий делитель "<<m<<endl;

return 0;

}

На рис. 4.3 представлен результат выполнения программы листинга 4.2.

Рис. 4.3. Результат работы программы листинга 4­.2

Листинг 4.3. Найти простые числа, не превышающие заданного натурального числа N [26].

Первые простые числа – это 2 и 3. Если введенное число совпадает с ними, то их следует напечатать. В остальных случаях следует проверить, имеет ли текущее число делители меньше кадратного корня из числа. Четные числа проверять нет необходимости, так как они всегда имеют делитель 2.

//L4_3.cpp

#include <iostream>

using namespace std;

int main()

{

setlocale(LC_CTYPE,"russian");

int N,d,k;

do // Цикл гарантирует

{ // введение натурального

// числа.

cout<<"Введите натуральное число n ";

cin>>N;

}while (N<=0);

if(N>=2)

cout<<2<<" ";

if(N>=3)

cout<<3<<" ";

k=5;

while (k<=N)

{

for(d=2; d*d<k && k%d!=0; d++)

;

if(d*d>k) // Число простое

cout<<k<<" ";

k+=2;

}

cout<<endl;

return 0;

}

Результат работы программы листинга 4.3 приведен на рис. 4.4:

Рис. 4.4. Результат работы программы листинга 4­.3


Понравилась статья? Добавь ее в закладку (CTRL+D) и не забудь поделиться с друзьями:  



double arrow
Сейчас читают про: