Форум программистов, компьютерный форум CyberForum.ru

Нахождение целых корней многочлена методом Горнера - C++

Восстановить пароль Регистрация
Другие темы раздела
C++ программирование математических вычислений http://www.cyberforum.ru/cpp-beginners/thread659763.html
Для 5 векторов, координаты которых записаны в массиве 5x3, определить номер того, длина которого минимальна, с помощью функции, которая вычисляет модуль вектора как массива 3 чисел. ?
C++ Деление двух скобок Написал программу для выражения m=(ax+b)/(cx+d) , но допустим при вводе всех единичек он выдает результат 10, хотя должен 1... В чем может быть проблема? #include <iostream> #include <conio.h> using namespace std; int main() { int m,a,x,b,c,d; printf("Введите значения a,x,b,c,d: "); scanf("%d %d %d %d %d", &a,&x,&b,&c,&d); m=(a*x+b)/(c*x+d); http://www.cyberforum.ru/cpp-beginners/thread659749.html
Кратность C++
Сколько среди введенных четных чисел кратно 2.
C++ ActiveX компонент TeeChart и Visual Studio C++, рисование графиков
Помогите разобраться с ActiveX компонентом TeeChart, Есть файл TeeChart6.ocx, положил его в папку system32, зарегистрировал в системе regsrv32.exe. Создаю диалоговое приложение, на форму диалогового окна вставляю ActivX компонент TeeChart. Двойным щелчком по нему вызываю меню и создаю Series1. Дальнейшие мои действия? Нужно создать объект? Как это сделать, и как к нему обращаться в...
C++ Агрегация по ссылке http://www.cyberforum.ru/cpp-beginners/thread659727.html
Надо описать наследование классов используя агрегацию по ссылке, текст программы я написал, н окомпилятор выдает ошибку( подскажите как ее исправить? =) #include <iostream> using namespace std; class F { public: F() {f = 0;} int f; void mf() { f += 1;
C++ Почему не работает malloc()? int *p; p=malloc(10*sizeof(int)); При компиляции указывает на строчку с malloc и пишет error: invalid conversion from ‘void*’ to ‘int’. В чём ошибка? подробнее

Показать сообщение отдельно
Buckstabue
 Аватар для Buckstabue
175 / 124 / 6
Регистрация: 12.01.2012
Сообщений: 624
28.09.2012, 21:39     Нахождение целых корней многочлена методом Горнера
У меня кое-где сохранился код, вроде нормально работает, но он под заточен под контейнеры Qt. Времени нет его на STL переписывать, может, сама разберешься или кого сведующего попросишь?
Там многие qt данные "затипедфены" и по идее не так много работы надо произвести, чтобы перевести на простой C++
gorner.hpp
C++ (Qt)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
#ifndef GORNER_HPP
#define GORNER_HPP
 
#include <QList>
#include <QString>
 
typedef QList<qint64> CoefList;
typedef CoefList RootList;
 
namespace gorner
{
/* getRoots() возвращает список корней многочлена.
   В строке inputStr задаются коэффициенты многочлена - целые числа,
   разделенные пробельными символами */
RootList getRoots(QString inputStr);
// а сюда передается список коэффициентов от самого страшего к младшему
RootList getRoots(const CoefList& coefList);
// возвращает остаток от деления многочлена с коэффициентами coefList на (x - x0)
qint64 getRest(const CoefList& coefList, const qint64& x0);
}
#endif // GORNER_HPP

gorner.cpp
C++ (Qt)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
#include "gorner.hpp"
 
#include <QtCore>
 
RootList gorner::getRoots(QString inputStr)
{
   QTextStream txtStream(&inputStr);
   CoefList coefList;
   qint64 tmp;
 
   while (!txtStream.atEnd())
   {
      txtStream >> tmp;
      coefList.push_back(tmp);
   }
 
   // избавляемся от лидирующих нулей
   while (!coefList.empty() && coefList.front() == 0)
      coefList.pop_front();
 
   return getRoots(coefList);
}
 
RootList gorner::getRoots(const CoefList& coefList)
{
   RootList rootsList; // список корней
   qint64 a0 = qAbs(coefList.back()); // модуль свободного члена
   const qint64 MAX_A0_DIVISOR = a0 / 2; // максимальный делитель свободного члена
 
   if (coefList.empty())
      // если пустое уравнение
      return RootList();
 
   for (qint64 a0_divisor = 1; a0_divisor <= MAX_A0_DIVISOR; ++a0_divisor)
   {
      if (a0 % a0_divisor != 0)
         // если не делится нацело, то это не корень
         continue;
 
      // проверка корней
      if (getRest(coefList, a0_divisor) == 0)
         rootsList.push_back(a0_divisor);
 
      if (getRest(coefList, -a0_divisor) == 0)
         rootsList.push_back(-a0_divisor);
   }
 
   // проверка на корень самого коэффициента свободного члена
 
   if (getRest(coefList, a0) == 0)
      rootsList.push_back(a0);
 
   if (getRest(coefList, -a0) == 0)
      rootsList.push_back(-a0);
 
   return rootsList;
}
 
qint64 gorner::getRest(const CoefList& coefList, const qint64& x0)
{
   qint64 rest = 0;
 
   for (auto const &i : coefList)
   {
      rest = x0 * rest + i;
   }
 
   return rest;
}
 
Текущее время: 04:11. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru