Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

ПЕРОВА САБАЕВА

.pdf
Скачиваний:
190
Добавлен:
11.03.2016
Размер:
1.4 Mб
Скачать
setlocale(LC_CTYPE,"russian"); int n,m,r;
do
{

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()

{

// Цикл гарантирует // введение натуральных // чисел.

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;

33

}

На рис. 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<<" ";

34

k+=2;

}

cout<<endl; return 0;

}

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

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

УПРАЖНЕНИЯ

1.Для натурального числа N найти сумму всех делителей, включая 1 и само число.

2.Для натурального числа N найти число четных делителей.

3.Для натурального числа N найти число всех делителей, исключая 1 и само число.

4.Для натурального числа N найти сумму всех нечетных делителей, включая 1 и само число (если оно нечетное).

5.Для натурального числа N найти сумму всех четных делителей, включая и само число (если оно четное).

6.Найти все натуральные числа из интервала от 1 до 200, у которых сумма делителей равна N.

7.Найти все натуральные числа из интервала от 1 до 200, у которых число делителей равно N.

8.Найти все натуральные числа из интервала от N 1 до N 2, у которых сумма делителей больше K.

9.Найти все натуральные числа из интервала от N 1 до N 2, у которых сумма делителей меньше или равна K.

10.Найти натуральное число в диапазоне от 1 до10 000 с максимальной суммой делителей.

11.Найти натуральное число в диапазоне от 1 до 10 000 с минимальной суммой делителей.

12.Найти натуральное число в диапазоне от 1 до 10 000 с максимальным числом делителей.

13.Найти количество делителей натурального числа N, больших K.

35

14.Даны целые числа p и q. Получить все делители числа q, взаимно простые с p. Числа называются взаимно простыми, если у них нет ощих делителей, кроме 1. Например, 15 и 8.

15.Получить все простые делители числа N.

16.Среди всех четырехзначных чисел найти все простые числа, у которых сумма двух старших цифр равна сумме двух младших цифр.

17.Найти наибольший обший делитель трех чисел НОД(N,M,K), используя соотношение НОД(N,M,K) = НОД(НОД(N,M),K).

18.Даны натуральные числа M и N. Получить все кратные им числа, меньшие M N.

19.Для натуральных чисел N и M найти наименьшее общее кратное, используя соотношение НОК(N,M)= N M / НОД(N,M).

20.Найти наибольший обший делитель n чисел НОД(N1,N2,…,Nk), используя соотношение:

НОД(N1,N2,…,Nk) = НОД(НОД(N1,N2,…),Nk) =

НОД(НОД(НОД(N1,N2,…,Nk-2), Nk-1) ,Nk) и так далее.

21.Найти все совершенные натуральные числа не превосходящие N. Совершенным называется число, равное сумме своих делителей, включая 1 и исключая само число. Например, 28=1+2+4+7+14.

22.Найти все совершенные натуральные числа из интервала от N 1 до N 2 . 23.Найти все простые множители числа N, причем каждый из них должен

быть выведен столько раз, сколько он встречается в исходном числе. Например, N = 28 = 2 2 7.

24.Найти все простые множители числа N, причем каждый из них должен быть выведен один раз. Например, N = 28 2 7.

25.Найти все пары дружественных натуральных чисел из интервала от N 1 до N 2. Два числа называются дружественными, если каждое из них равно сумме делителей другого (само число в качестве делителя не рассматривается).

36

ГЛАВА 5. СОРТИРОВКА ДАННЫХ

Сортировку данных можно осуществлять различными алгоритмами. Среди них наиболее часто применяются следующие методы [10]: сортировка вставкой, метод пузырька, сортировка выбором и быстрая сортировка. Рассмотрим эти методы подробнее.

5.1. Сортировка вставкой

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

Листинг 5.1. Программа демонстрирует метод сортировки вставкой массива из 10 целых элементов.

//L5_1.cpp

#include <iostream> using namespace std; int main()

{

setlocale(LC_CTYPE,"russian"); int A[10], n=10, i, j, key; for(i=0; i<n; i++)

{

cout<<"Введите А("<<i+1<<")="; cin>>A[i];

}

cout<<"Исходный массив\n"; for(i=0; i<n; i++)

cout<<A[i]<<" "; cout<<endl;

for(i = 1; i<n; i++)

{

key = A[i]; j = i - 1;

while (j >= 0 && A[j] > key)

{

A[j + 1] = A[j]; j = j - 1;

37

A[j + 1] = key;

}

}

cout<<"Полученный массив\n"; for(i=0; i<n; i++)

cout<<A[i]<<" "; cout<<endl;

return 0;

}

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

Рис. 5.1. Результат работы программы листинга 5.1

5.2. Метод пузырька

Алгоритм сортировки методом пузырька состоит из повторяющихся проходов по сортируемому массиву. За каждый проход элементы последовательно сравниваются попарно и, если порядок в паре неверный, выполняется обмен элементов. Проходы по массиву повторяются N-1 раз или до тех пор, пока на очередном проходе не окажется, что обмены больше не нужны. Это означает, что массив отсортирован. При каждом проходе алгоритма по внутреннему циклу, очередной наибольший элемент массива ставится на своё место в конце массива рядом с предыдущим наибольшим элементом, а наименьший элемент перемещается на одну позицию к началу массива («всплывает» до нужной позиции как пузырёк в воде, отсюда и название данного алгоритма).

Листинг 5.2. Задан список студентов с указанием фамилии и номера группы. Упорядочить этот список по возрастанию номера группы, а внутри группы построить его в алфавитном порядке.

38

//L5_2.cpp

#include <string.h> #include <iostream> using namespace std; int main()

{

setlocale(LC_CTYPE,"russian"); int n, i,*grup, f, k=0, gtmp;

char **name, *ntmp, fam[30]; do

{

cout<<"Введите число студентов "; cin>>n;

}while(n<=0);

 

name=new char*[n];

// Выделение памяти для указателей,

 

// связанных с фамилией студентов.

grup=new int[n];

// Выделение памяти под номера групп.

for(i=0; i<n; i++)

 

{

 

cout<<"Введите фамилию "<<i+1<<"-го студента и его группу "; cin>>fam>>grup[i];

name[i]=strdup(fam); // Заполняется фамилия i-го студента

}

do

{

f=0;

for(i=0; i<n-1-k; i++)

//Сравнение по группам, а если они равны, сравнение фамилий: if(grup[i]>grup[i+1] || (grup[i]==grup[i+1] && strcmp(name[i],name[i+1])>0))

{

ntmp=name[i];

name[i]=name[i+1];

name[i+1]=ntmp;

gtmp=grup[i];

grup[i]=grup[i+1];

grup[i+1]=gtmp;

f=1;

}

}while (f);

cout<<"Полученный список\n";

setlocale(LC_CTYPE,".866"); //Установка страницы для правильного //вывода символов кириллицы.

for(i=0; i<n; i++)

{

39

cout.width(6);

//Выделение поля для вывода группы

cout<<grup[i]<<"

";

cout<<name[i]<<'\n';

}

return 0;

}

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

Рис. 5.2. Результат работы программы листинга 5.2

5.3. Сортировка выбором

Алгоритм сортировки выбором состоит из трех шагов:

1.Находится номер минимального значения в текущем списке.

2.Производится обмен этого значения со значением первой, не отсортированной позиции (обмен не нужен, если минимальный элемент уже находится на данной позиции).

3.Сортируется «хвост» списка, исключив из рассмотрения уже отсортированные элементы.

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

Листинг 5.3. Задан список студентов с указанием фамилии и номера группы (рис. 5.3). Упорядочить этот список по возрастанию номера группы, а внутри группы построить его в алфавитном порядке.

40

//L5_3.cpp

#include <string.h> #include <iostream> using namespace std;

int main()

{

setlocale(LC_CTYPE,"russian"); int n, i, j, *grup, jmax, gm;

char **name, fam[30], *fm; fstream ff("input.txt"); ff>>n;

name=new char*[n]; //Выделение памяти для указателей, связанных //с фамилией студентов.

grup=new int[n]; //Выделение памяти под номера групп for(i=0;i<n;i++)

{

ff>>fam>>grup[i];

name[i]=strdup(fam); //Заполняется фамилия i-го студента

}

ff.close(); for(i=0;i<n-1;i++)

{

fm=name[i];

gm=grup[i];

jmax=i;

for(j=i+1;j<n;j++)

if(grup[j]<gm ||(grup[j]==gm && strcmp(name[j],fm)<0))

{

fm=name[j];

gm=grup[j];

jmax=j;

}

name[jmax]=name[i];

name[i]=fm;

grup[jmax]=grup[i];

grup[i]=gm;

}

cout<<"Полученный список\n"; for(i=0;i<n;i++)

{

cout.width(6);

//Выделение поля для вывода группы

cout<<grup[i]<<"

";

cout<<name[i]<<'\n';

41

}

ff.open("input.txt", ios::app); ff<<"\nПолученный список\n"; for(i=0;i<n;i++)

{

ff.width(6); ff<<grup[i]<<" "; ff<<name[i]<<'\n';

}

ff.close();

cin.get(); return 0;

}

Содержимое файла “input.txt”

Рис. 5.3. Информация, находящаяся в файле «input.txt»

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

Рис. 5.4. Результат работы программы листинга 5.3

42