- •Нижегородский государственный университет им. Н.И. Лобачевского
- •Оглавление
- •Предисловие
- •Глава 1. Вычисление значений функций
- •1.1. Операторы циклов
- •1.2. Операторы ветвления
- •Когда в программе нужно выбрать один из многочисленных вариантов, бывает целесообразным применять оператор-переключатель switch. Этот оператор называется ещё оператором множественного выбора [1].
- •Switch (выражение)
- •1.3. Алгоритмы, необходимые для написания программ
- •Глава 2. Суммирование рядов
- •Глава 3. Позиционная запись числа
- •Глава 4. Делители целого числа
- •5.1. Сортировка вставкой
- •5.2. Метод пузырька
- •5.3. Сортировка выбором
- •5.4. Быстрая сортировка
- •Глава 6. Работа с файлами. Построение массивов без повторений
- •6.1. Работа с файлами
- •6.2. Построение массивов без повторений
- •Глава 7. Обработка последовательности символов
- •7.1. Алгоритм выделения слова из строки
- •7.2. Выбор слов, подходящих под шаблон
- •7.3. Перевод прописных символов в строчные
- •Глава 8. Побитовые операции
- •Глава 9. Преобразование и построение матриц
- •Содержимое файла “input.Txt”
- •Глава 10. Структуры
- •Выделение памяти под объект coat
- •Содержимое файла "input.Txt".
- •Содержимое файла "outout.Txt"
- •Содержимое файла "input.Txt"
- •11. Динамические структуры данных
- •11.1. Односвязные списки
- •11.2. Очереди
- •11.3. Стеки
- •Содержимое файла “input.Txt”
- •Содержимое файла “input.Txt”
- •Список литературы
Глава 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
Упражнения
Для натурального числа N найти сумму всех делителей, включая 1 и само число.
Для натурального числа N найти число четных делителей.
Для натурального числа N найти число всех делителей, исключая 1 и само число.
Для натурального числа N найти сумму всех нечетных делителей, включая 1 и само число (если оно нечетное).
Для натурального числа N найти сумму всех четных делителей, включая и само число (если оно четное).
Найти все натуральные числа из интервала от 1 до 200, у которых сумма делителей равна N.
Найти все натуральные числа из интервала от 1 до 200, у которых число делителей равно N.
Найти все натуральные числа из интервала от N 1 до N 2, у которых сумма делителей больше K.
Найти все натуральные числа из интервала от N 1 до N 2, у которых сумма делителей меньше или равна K.
Найти натуральное число в диапазоне от 1 до10 000 с максимальной суммой делителей.
Найти натуральное число в диапазоне от 1 до 10 000 с минимальной суммой делителей.
Найти натуральное число в диапазоне от 1 до 10 000 с максимальным числом делителей.
Найти количество делителей натурального числа N, больших K.
Даны целые числа p и q. Получить все делители числа q, взаимно простые с p. Числа называются взаимно простыми, если у них нет ощих делителей, кроме 1. Например, 15 и 8.
Получить все простые делители числа N.
Среди всех четырехзначных чисел найти все простые числа, у которых сумма двух старших цифр равна сумме двух младших цифр.
Найти наибольший обший делитель трех чисел НОД(N,M,K), используя соотношение НОД(N,M,K) = НОД(НОД(N,M),K).
Даны натуральные числа M и N. Получить все кратные им числа, меньшие MN.
Для натуральных чисел N и M найти наименьшее общее кратное, используя соотношение НОК(N,M)= NM / НОД(N,M).
Найти наибольший обший делитель n чисел НОД(N1,N2,…,Nk), используя соотношение:
НОД(N1,N2,…,Nk) = НОД(НОД(N1,N2,…),Nk) =
НОД(НОД(НОД(N1,N2,…,Nk-2), Nk-1) ,Nk) и так далее.
Найти все совершенные натуральные числа не превосходящие N. Совершенным называется число, равное сумме своих делителей, включая 1 и исключая само число. Например, 28=1+2+4+7+14.
Найти все совершенные натуральные числа из интервала от N 1 до N 2 .
Найти все простые множители числа N, причем каждый из них должен быть выведен столько раз, сколько он встречается в исходном числе. Например, N = 28 = 227.
Найти все простые множители числа N, причем каждый из них должен быть выведен один раз. Например, N = 28 2 7.
Найти все пары дружественных натуральных чисел из интервала от N 1 до N 2. Два числа называются дружественными, если каждое из них равно сумме делителей другого (само число в качестве делителя не рассматривается).
ГЛАВА 5. Сортировка данных
Сортировку данных можно осуществлять различными алгоритмами. Среди них наиболее часто применяются следующие методы [10]: сортировка вставкой, метод пузырька, сортировка выбором и быстрая сортировка. Рассмотрим эти методы подробнее.