Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Касаткин С., Раткевич И., Травова Н. - Лаборато...doc
Скачиваний:
0
Добавлен:
22.11.2019
Размер:
1.01 Mб
Скачать

3. Программа, которая находит на заданном отрезке натуральные числа, которые можно представить в виде суммы квадратов двух натуральных чисел.

#include<iostream>

#include<iomanip>

#include <math.h>

#include <conio.h>

#include <windows.h>

using namespace std;

/* Определяем функцию, которая будет определять, можно ли представить число в виде суммы квадратов двух натуральных чисел. Поскольку должно выполняться равенство , будем проверять все возможные значения a в диапазоне [1, и для каждого а будем вычислять b по формуле: . Поскольку b должно быть натуральным, округлим результат вычисления по формуле до ближайшего целого. Если в результате округления равенство нарушается, значит число нельзя представить в виде суммы квадратов двух натуральных чисел.

Аргументами функции являются: проверяемое число n и ссылки на a и b; a и b объявлены как ссылки, поскольку функция должна передать их найденные значения главной программе, которая выведет их на экран. Функция возвращает либо 0, либо 1. */

byte IsPossible(long n, long& a, long& b)

{

byte flag = 0;

for (a = 1; a < sqrt((double)(n)); a++)

{

b = long(sqrt((double)(n - a*a)) + .5);

if (n == a * a + b * b)

{

flag = 1; break;

}

}

return flag;

}

//=========================================================

/* Главная программа проверяет заданный диапазон и выводит найденные числа на экран */

int main()

{

//Настройки шрифтов и региональных стандартов

if(SetConsoleCP(1251)==0)

{

cerr<<"Fialed to set codepage!"<<endl;

}

if(SetConsoleOutputCP(1251)==0) //тоже самое для вывода

{

cerr<<"Failed to set OUTPUT page!"<<endl;

}

long m, n;

long a, b;

cout<< "Задайте диапазон (два натуральных числа) \n";

cin >> m >> n;

byte flag=0;

// Проходим заданный диапазон [m,n] и проверяем число i:

for (long i = m; i <= n; i++)

if (IsPossible(i, a, b)) /* Если i удовлетворяет условию, выполняем нижеследующие действия: */

{

if (!flag) /* Если флажок равен 0, значит най­дено первое число, в этом случае выводим поясняющий текст: */

{

cout<< "Числа, которые можно представить ";

cout<< "в виде суммы квадратов двух натуральных чисел\n";

}

flag = 1; /* Делаем флажок равным 1, текст больше выводиться не будет */

cout<< i << " = " << a << "*" << a <<" + " << b << "*" << b << endl;

// Вывели результат типа 5 = 1*1 + 2*2

}

/* Здесь проверка заданного отрезка закончилась, если флажок остался равным 0, выводим сообщение: */

if (!flag) cout<< "На этом отрезке нет нужных чисел\n";

_getch();

return 0;

}

  1. Программа, которая находит первое автоморфное число справа от заданного.

Автоморфным называется число, которое равно последним цифрам своего квадрата, например 25 (25 * 25 = 625).

#include <iostream>

#include <iomanip>

#include <math.h>

#include <conio.h>

#include <windows.h>

using namespace std;

bool Automorfnoe(long n)

{

long copy = n; // Берем копию числа n

long m = 1; /* Сделаем число m, которое равно степени 10, причем степень равна количеству цифр проверяемого числа n, например для 25 число m = 100 */

do

{

m *= 10;

copy /= 10;

} while(copy);

if ((n*n % m) == n) /* Берем остаток от деления квадрата числа n на m и получаем число, состоящее из последние цифр квадрата n, количество которых равно количеству цифр исходного числа, сравниваем полученное число c n и возвращаем ис­тину, если числа равны */

return true;

else return false;

}

int main()

{

if(SetConsoleCP(1251)==0

{

cerr<<"Fialed to set codepage!"<<endl;

}

if(SetConsoleOutputCP(1251)==0)

{

cerr<<"Failed to set OUTPUT page!"<<endl;

}

do

{

long m;

cout<< "Задайте целое число ";

cin>> m;

// Поиск автоморфного числа n, лежащего справа от заданного числа m:

long n = m+1; // Берем первое число

bool flag = true;

while (!Automorfnoe(n)) // пока число не автоморфное

{

n++; // переходим к следующему числу

if (n > 1e5) { flag = FALSE; break;}

/* прерываем поиск, если число стало слишком большим, чтобы ограничить время выполнения программы и не выйти за допустимый диапазон чисел */

}

if (flag) // флажок, равный true, означает, что число найдено

cout<< "Автоморфное число справа - " << n << " : " << n <<" в квадрате = " << n * n << endl;

else cout<< "Число не найдено \n";

} while (_getch() != 27);

return 0;

}

5. Программа находит точки пересечения линий y= ax+b и y = c/x +d

(программа иллюстрирует перегрузку имени функции)

Для нахождения точек пересечения решим систему:

Если a не равно 0, решаем квадратное уравнение, в противном случае – линейное.

#include <iostream>

#include <iomanip>

#include <math.h>

#include <conio.h>

#include <windows.h>

using namespace std;

/* Определим две функции Root(корень), одну для решения квадратного уравнения, а другую – для линейного: */

void Root(double a, double b, double c, double& x1, double& x2, byte& k);

void Root(double a, double b, double& x, byte& k);

// Результаты работы функции объявлены как ссылки

int main()

{

if(SetConsoleCP(1251)==0)

//проверка правильности установки кодировки символов для ввода

{

cerr<<"Fialed to set codepage!"<<endl;

}

if(SetConsoleOutputCP(1251)==0)

{

cerr<<"Failed to set OUTPUT page!"<<endl;

}

double a, b, c, d;

double x1, y1, x2, y2;

byte k; // количество корней

do

{

cout<< "Задайте a b c d ";

cin>> a >> b >> c >> d;

if (a) // Если а не равно 0, решаем квадратное уравнение

Root(a, b-d, -c, x1, x2, k);

// передаем функции коэффициенты уравнения и получаем корни и количество корней

else // иначе решаем линейное уравнение:

Root(b-d, -c, x1, k);

// в зависимости от полученного значения k выводим ответ:

switch(k)

{

case 3: cout<< "Линии совпадают \n"; break;

case 2: y1 = a*x1 + b; y2 = a*x2 + b;

cout<<"Линии пересекаются в 2 точках: " <<setprecision(2)<< x1 << ',' << y1 << " и " << x2 << ',' << y2 << endl; break;

case 1: y1 = a*x1+ b;

cout<<"Линии имеют одну общую точку "<<setprecision(2)<< x1 << ',' << y1 << endl; break;

default: cout<<"Линии не пересекаются\n";

}

} while (_getch() != 27);

return 0;

}

// Подпрограмма для решения квадратного уравнения

void Root(double a, double b, double c, double& x1, double& x2, byte& k)

{

double d = b*b - 4*a*c;

if (d > 0)

{

k = 2;

x1 = (-b + sqrt(d)) / (2*a);

x2 = (-b - sqrt(d)) / (2*a);

if ( x1==0 || x2 == 0 ) k = 1;

// Исключаем нулевое значение x

if ( x1 == 0) x1 = x2; /* Если ненулевой корень один, то он будет храниться в x1 */

}

else if (d == 0)

{

x1 = -b / (2*a);

k = 1;

if (x1 == 0) k = 0;

}

else k = 0;

}

// Подпрограмма для решения линейного уравнения

void Root(double a, double b, double& x, byte& k)

{

if (a)

{

k = 1;

x = -b / a;

if (x == 0) k = 0;

}

else if (b) k = 0;

else k = 3;

}

Тут вы можете оставить комментарий к выбранному абзацу или сообщить об ошибке.

Оставленные комментарии видны всем.