Линейные алгоритмы Составит программу на С++ для вычисления значений функции Базовый уровень P = n√y³ + 1.09g Не смог писать код в программе Visual Studio 2019..
//PascalABC.NET Версия 3.0 Сборка 1150 var n:integer; begin writeln('Сколько стоит товар?'); readln(n); n:=1000-n; writeln('Сдача ',n,' рублей. Нужны купюры:'); writeln(n div 500, ' по 500 рублей, ', (n-(n div 500)*500)div 100, ' по 100 рублей, ', (n mod 100) div 50, ' по 50 рублей, ', (n-(n div 50)*50) div 10,' по 10 рублей, и ещё ', n mod 10, ' рублей мелочью.'); end.
Результат работы: Сколько стоит товар? 324 Сдача 676 рублей. Нужны купюры: 1 по 500 рублей, 1 по 100 рублей, 1 по 50 рублей, 2 по 10 рублей, и ещё 6 рублей мелочью.
Вам нужно найти такие a и b, что a + b = x и ab = y. По теореме Виета a и b - корни уравнения . Находим дискриминант , если он отрицательный - у уравнения не то что натуральных, действительных решений нет. Если дискриминант неотрицательный, но не полный квадрат, то натуральных решений тоже нет. Иначе решения уравнения , если они натуральные - это и есть ответ.
У меня нет уверенности, что можно посчитать целый корень из большого натурального числа с стандартных функций, так что напишу свою реализацию на основе двоичного поиска.
var n:integer;
begin
writeln('Сколько стоит товар?');
readln(n);
n:=1000-n;
writeln('Сдача ',n,' рублей. Нужны купюры:');
writeln(n div 500, ' по 500 рублей, ', (n-(n div 500)*500)div 100, ' по 100 рублей, ', (n mod 100) div 50, ' по 50 рублей, ', (n-(n div 50)*50) div 10,' по 10 рублей, и ещё ', n mod 10, ' рублей мелочью.');
end.
Результат работы:
Сколько стоит товар?
324
Сдача 676 рублей.
Нужны купюры:
1 по 500 рублей, 1 по 100 рублей, 1 по 50 рублей, 2 по 10 рублей, и ещё 6 рублей мелочью.
Вам нужно найти такие a и b, что a + b = x и ab = y. По теореме Виета a и b - корни уравнения
. Находим дискриминант
, если он отрицательный - у уравнения не то что натуральных, действительных решений нет. Если дискриминант неотрицательный, но не полный квадрат, то натуральных решений тоже нет. Иначе решения уравнения
, если они натуральные - это и есть ответ.
У меня нет уверенности, что можно посчитать целый корень из большого натурального числа с стандартных функций, так что напишу свою реализацию на основе двоичного поиска.
#include <iostream>
#include <cmath>
long long isqrt(long long number) {
long long answer = 0, left = 0, right = 1e9;
while (left <= right) {
long long middle = (left + right) / 2;
long long middle_squared = middle * middle;
if (middle_squared == number) {
return middle;
} else if (middle_squared < number) {
answer = middle;
left = middle + 1;
} else {
right = middle - 1;
}
}
return answer;
}
int main() {
long long x, y;
std::cin >> x >> y;
auto d = x * x - 4 * y;
if (d < 0) {
std::cout << 0;
return 0;
}
auto sqrt_d = isqrt(d);
if (sqrt_d * sqrt_d != d) {
std::cout << 0;
return 0;
}
if ((x - sqrt_d) % 2 != 0) {
std::cout << 0;
return 0;
}
std::cout << (x - sqrt_d) / 2 << " " << (x + sqrt_d) / 2;
}