Программа, которая находит первое автоморфное число справа от заданного.
Автоморфным называется число, которое равно последним цифрам своего квадрата, например 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;
}