Решение задачи Уравнение с Acmp

Без пояснения   Просмотров: 94


Вася в школе изучил квадратные уравнения и понял, как они легко решаются путем вычисления дискриминанта. Но Петя поведал ему о методе решения кубических уравнений вида A*X3 + B*X2 + C*X + D = 0. На факультативе по математике Васе задали решить около ста уравнений как раз такого вида. Но, к сожалению, Вася забыл формулы, о которых рассказывал ему Петя. Но Васе было известно, что все корни уравнений – целые числа и находятся на отрезке [-100, 100]. Поэтому у Васи есть шанс найти их методом перебора, но для этого ему придется затратить уйму времени, т.к. возможно необходимо будет осуществить перебор нескольких тысяч значений. Помогите Васе написать программу, которая поможет ему найти корни кубических уравнений!

Код

#include <iostream>
#include <cmath>
#include <set>
using namespace std;
int a, b, c, d;
bool isRoot(int x)
{
    return !(a * pow(x, 3) + b * pow(x, 2) + c * x + d);
}
 
void SqEq(set< int > &r, int a, int b, int c)
{
    int d = sqrt(b * b - 4 * a * c);
    if(d < 0)
        return;
    int x = (-b - d) / (2 * a);
    r.insert(x);
    x = (-b + d) / (2 * a);
    r.insert(x);
}
 
int main()
{
    set< int > roots;
    cin >> a >> b >> c >> d;
    if(d) {
        for(int i = -100; i < 101; ++i)
            if(isRoot(i)){
                roots.insert(i);
                SqEq(roots, a, b + i * a, c + i * (b + i * a));
            }
                } else {
        roots.insert(0);
        SqEq(roots, a, b, c);
    }
    for(auto i : roots)
        cout << i << " ";
    return 0;
}

         

Администратор Photo Автор: Администратор




Комментарии

Чтобы написать комментарии вам нужно войти в систему или зарегистрироваться