Для нахождения всех делителей некоторого натурального числа 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