Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Приложения.doc
Скачиваний:
9
Добавлен:
09.11.2019
Размер:
374.78 Кб
Скачать

Нахождение наибольшего общего делителя (алгоритм Евклида)

#include "stdafx.h"

#include <iostream>

#include <conio.h>

using namespace std;

int NOD_1(int n, int m, int &Count)

// Известно, что: НОД(n, m) = НОД(n - m, m) при n > m и

// НОД(n, m) = НОД(n, m - n) при n < m.

{

int r, a = n, b = m;

Count = 0;

// Инвариант: НОД(a, b) = НОД(n, m)

// Цикл заканчивается при a = b, тогда НОД(n, m) = НОД(a, a) = a

while (a != b)

{

if (a > b)

a = a - b;

else

b = b - a;

++ Count;

}

return a;

}

int NOD_2(int n, int m, int &Count)

// Известно, что: НОД(n, m) = НОД(m, r), где r - остаток от деления n на m.

{

int r, a = n, b = m;

Count = 0;

// Инвариант: НОД(a, b) = НОД(n, m)

// Цикл заканчивается при b = 0, тогда НОД(n, m) = НОД(a, 0) = a

while (b)

{

r = a % b;

a = b;

b = r;

++ Count;

}

return a;

}

int _tmain(int argc, _TCHAR* argv[])

{

setlocale(0, "");

cout << " Алгоритм Евклида для нахождения наибольшего общего делителя.\n";

cout << " ------------------------------------------------------------\n";

for (char b = '1'; b != 27; cout << "\n\t\t\tПродолжим? (нет - Esc) ",

b = _getch(), cout << endl)

{

int Count;

int n, m;

cout << "\n Введите два целых числа больших 0: ";

cin >> n >> m;

cout << "\n Значение НОД чисел " << n << " и " << m << " равно "

<< NOD_1 (n, m, Count) << endl;

cout << "Число итераций: " << Count << endl;

cout << "\n Значение НОД чисел " << n << " и " << m << " равно "

<< NOD_2 (n, m, Count) << endl;

cout << "Число итераций: " << Count << endl;

}

return 0;

}

Примеры к разделу 7 Библиотека функций случайных чисел

/*

Датчик случайных чисел

Сохраните этот текст в файле с именем my_rand.h. Поместите

этот файл в каталог проекта и в тексте программы используйте директиву

#include "my_rand.h"

*/

#pragma once

#include <iostream>

#include <time.h>

using namespace std;

//

// Прототипы функций

//

void RandInit();

// Инициализация датчика случайных чисел с помощью системного времени

// Необходимо однократно вызвать при запуске программы

int MyRand(int d);

// Возвращает случайное целое в диапазоне от 0 до d

int MyRand(int ng, int vg);

// Возвращает случайное целое в диапазоне от ng до vg

//

// Реализация

//

void RandInit()

{

srand(_time32(NULL));

}

int MyRand(int d)

{

return rand() % (d + 1);

}

int MyRand(int ng, int vg)

{

return rand() % (vg - ng + 1) + ng;

}

Библиотека функций по работе с массивами общего назначения

/*

Смешанные функции по работе с массивами

Сохраните этот текст в файле с именем arr_common.h. Поместите

этот файл в каталог проекта и в тексте программы используйте директиву

#include " arr_common.h"

*/

#pragma once

#include "stdafx.h"

#include <iostream>

#include <iomanip>

#include "my_rand.h"

using namespace std;

//

// Прототипы функций

//

void RandMakeArr(double A[], int n, int d);

// Для массивов с эелементами типа double

// Заполняет массив А из n элементов случайными значениями в диапазоне от 0 до d

void RandMakeArr(double A[], int n, int ng, int vg);

// Для массивов с эелементами типа double

// Заполняет массив А из n элементов случайными значениями в диапазоне от ng до vg

void RandMakeArr(int A[], int n, int d);

// Для массивов с эелементами типа double

// Заполняет массив А из n элементов случайными значениями в диапазоне от 0 до d

void RandMakeArr(int A[], int n, int ng, int vg);

// Для массивов с эелементами типа double

// Заполняет массив А из n элементов случайными значениями в диапазоне от ng до vg

void ArrOut(double A[], int n);

// Вывод на экран массива А из n элементов типа double

void ArrOut(int A[], int n);

// Вывод на экран массива А из n элементов типа int

void Swap(double &a, double &b);

// Обмен значений переменных a и b

void Swap(int &a, int &b);

// Обмен значений переменных a и b

void Swap(int a[], int b[], int n);

// Обмен значений массивов a и b из n элементов типа int

void Swap(double a[], double b[], int n);

// Обмен значений массивов a и b из n элементов типа double

void ArrInit(int A[], int n, int Val);

// Заполнение массива А из n элементов типа int значениями Val

void ArrInit(double A[], int n, double Val);

// Заполнение массива А из n элементов типа double значениями Val

void ArrCopy(int Src[], int Dst[], int n);

// Копирование значений массива Src и Dst из n элементов типа int

void ArrCopy(double Src[], double Dst[], int n);

// Копирование значений массива Src и Dst из n элементов типа double

void MinMax(int A[], int n, int &iMax, int &iMin);

// Поиск минимального и максимального значений в массиве А из n элементов.

// Возвращает индексы первого минимального iMin и первого максимального iMax элементов

void MinMax(int A[], int n, int &iMax, int &iMin, int &cMax, int &cMin);

// Поиск минимального и максимального значений в массиве А из n элементов.

// Возвращает индексы первого минимального iMin и первого максимального iMax элементов и

// количества максимальных cMax и минимальных cMin элементов в массиве

void ArrDelItem(int A[], int &n, int di);

// Удаление элемента с индексом di из массива А с n элементами,

// что эквивалентно сдвигу элементов массива на 1 элемент в сторону меньших значений индексов элементов.

// Возвращает измененный массив А и его количество элементов n, уменьшенное на 1.

// Контроль корректности входных данных не осуществляется.

void ArrInsItem(int A[], int &n, int ii, int Val);

// Вставка элемента со значением Val на позицию с индексом ii в массив А с n элементами,

// что эквивалентно сдвигу элементов массива на 1 элемент в сторону больших значений индексов элементов и

// записи в элемент с идексом ii значения Val.

// Возвращает измененный массив А и его количество элементов n, увеличенное на 1.

// Контроль корректности входных данных не осуществляется.

void ArrConcat(int A1[], int n1, int A2[], int n2, int R[], int &n);

// Слияние двух отсортированных по возрастанию массивов А1 и А2 с количеством элементов n1 и n2 соответственно

// в массив R. Возвращает массив R (также отсортированный по возрастанию) и его количество элементов n

//

// Реализация

//

void RandMakeArr(double A[], int n, int d)

// Заполняет массив А из n элементов случайными значениями в диапазоне от 0 до d

{

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

A[i] = MyRand(d);

}

void RandMakeArr(double A[], int n, int ng, int vg)

// Заполняет массив А из n элементов случайными значениями в диапазоне от ng до vg

{

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

A[i] = MyRand(ng, vg);

}

void RandMakeArr(int A[], int n, int d)

// Заполняет массив А из n элементов случайными значениями в диапазоне от 0 до d

{

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

A[i] = MyRand(d);

}

void RandMakeArr(int A[], int n, int ng, int vg)

// Заполняет массив А из n элементов случайными значениями в диапазоне от ng до vg

{

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

A[i] = MyRand(ng, vg);

}

void ArrOut(double A[], int n)

// Вывод на экран массива А из n элементов типа double

{

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

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

cout << endl;

}

void ArrOut(int A[], int n)

// Вывод на экран массива А из n элементов типа double

{

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

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

cout << endl;

}

void Swap(double &a, double &b)

// Обмен значений переменных a и b

{

double c = a;

a = b;

b = c;

}

void Swap(int &a, int &b)

// Обмен значений переменных a и b

{

int c = a;

a = b;

b = c;

}

void Swap(int a[], int b[], int n)

// Обмен значений массивов a и b из n элементов типа int

{

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

Swap(a[i], b[i]);

}

void Swap(double a[], double b[], int n)

// Обмен значений массивов a и b из n элементов типа double

{

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

Swap(a[i], b[i]);

}

void ArrInit(int A[], int n, int Val)

// Заполнение массива А из n элементов типа int значениями Val

{

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

A[i] = Val;

}

void ArrInit(double A[], int n, double Val)

// Заполнение массива А из n элементов типа double значениями Val

{

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

A[i] = Val;

}

void ArrCopy(int Src[], int Dst[], int n)

// Копирование значений массива Src и Dst из n элементов типа int

{

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

Dst[i] = Src[i];

}

void ArrCopy(double Src[], double Dst[], int n)

// Копирование значений массива Src и Dst из n элементов типа double

{

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

Dst[i] = Src[i];

}

void MinMax(int A[], int n, int &iMax, int &iMin)

// Поиск минимального и максимального значений в массиве А из n элементов.

// Возвращает индексы первого минимального iMin и первого максимального iMax элементов

{

int Max, Min;

iMax = iMin = 0;

Max = Min = A[0];

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

{

if (A[i] > Max)

{

iMax = i;

Max = A[i];

}

if (A[i] < Min)

{

iMin = i;

Min = A[i];

}

}

}

void MinMax(int A[], int n, int &iMax, int &iMin, int &cMax, int &cMin)

// Поиск минимального и максимального значений в массиве А из n элементов.

// Возвращает индексы первого минимального iMin и первого максимального iMax элементов и

// количества максимальных cMax и минимальных cMin элементов в массиве

{

int Max, Min;

iMax = iMin = 0;

cMax = cMin = 1;

Max = Min = A[0];

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

{

if (A[i] > Max)

{

cMax = 1;

iMax = i;

Max = A[i];

}

else

if (A[i] == Max)

++cMax;

if (A[i] < Min)

{

cMin = 1;

iMin = i;

Min = A[i];

}

else

if (A[i] == Min)

++cMin;

}

}

void ArrDelItem(int A[], int &n, int di)

// Удаление элемента с индексом di из массива А с n элементами,

// что эквивалентно сдвигу элементов массива на 1 элемент в сторону меньших значений индексов элементов.

// Возвращает измененный массив А и его количество элементов n, уменьшенное на 1.

// Контроль корректности входных данных не осуществляется.

{

--n;

for (int i = di; i < n; ++i)

A[i] = A[i + 1];

}

void ArrInsItem(int A[], int &n, int ii, int Val)

// Вставка элемента со значением Val на позицию с индексом ii в массив А с n элементами,

// что эквивалентно сдвигу элементов массива на 1 элемент в сторону больших значений индексов элементов и

// записи в элемент с идексом ii значения Val.

// Возвращает измененный массив А и его количество элементов n, увеличенное на 1.

// Контроль корректности входных данных не осуществляется.

{

if (ii > n) // Если индекс вставки больше индекса последнего элемента массива более чем на 1, то

// новый элемент вставляется сразу за последним элементом массива.

ii = n;

for (int i = n; i > ii; --i)

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

A[ii] = Val;

++n;

}

void ArrConcat(int A1[], int n1, int A2[], int n2, int R[], int &n)

// Слияние двух отсортированных по возрастанию массивов А1 и А2 с количеством элементов n1 и n2 соответственно

// в массив R. Возвращает массив R (также отсортированный по возрастанию) и его количество элементов n.

{

int i, j;

n = i = j = 0;

while (n < n1 + n2)

{

while ((i < n1) && ((A1[i] <= A2[j]) || (j == n2)))

{

R[n] = A1[i];

++i;

++n;

}

while ((j < n2) && ((A2[j] <= A1[i]) || (i == n1)))

{

R[n] = A2[j];

++j;

++n;

}

}

}