Форум программистов, компьютерный форум 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
01.10.2012, 17:12     Нахождение целых корней многочлена методом Горнера
Немного допилил то стандартного C++. Допустим нам надо решить уравнение x^2 + 2*x + 1 = 0, тогда в троке ввода надо ввести "1 2 1", а если надо решить x^3 - 1 = 0, надо ввести "1 0 0 1", т.к. мы по сути решаем 1 * x^3 + 0*x^2 + 0*x + 1
Сам код
C++
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
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
#include <iostream>
#include <string>
#include <sstream>
#include <cstdlib>
#include <list>
 
typedef std::list<long> CoefList;
typedef CoefList RootList;
 
/* getRoots() возвращает список корней многочлена.
   В строке inputStr задаются коэффициенты многочлена - целые числа,
   разделенные пробельными символами */
RootList getRoots(const std::string& inputStr);
// а сюда передается список коэффициентов от самого страшего к младшему
RootList getRoots(const CoefList& coefList);
// возвращает остаток от деления многочлена с коэффициентами coefList на (x - x0)
long getRest(const CoefList& coefList, const long& x0);
 
int main()
{
   std::string coefStr;
   RootList rootList;
   int n = 0;
 
   std::cout << "введите коэфициенты при неизвестных: ";
   std::getline(std::cin, coefStr);
 
   rootList = getRoots(coefStr);
 
   if (rootList.empty())
   {
      std::cout << "Целых корней нет." << std::endl;
   }
 
   n = 0;
   for (RootList::const_iterator i = rootList.begin(); i != rootList.end(); ++i)
   {
      n++;
      std::cout << "x" << n << " = " << *i << std::endl;
   }
 
   return 0;
}
 
RootList getRoots(const std::string& inputStr)
{
   std::istringstream strStream(inputStr);
   CoefList coefList;
   long tmp;
 
   while (strStream >> tmp)
   {
      coefList.push_back(tmp);
   }
 
   // избавляемся от лидирующих нулей
   while (!coefList.empty() && coefList.front() == 0)
      coefList.pop_front();
 
   return getRoots(coefList);
}
 
RootList getRoots(const CoefList& coefList)
{
   RootList rootsList; // список корней
   long a0 = abs(coefList.back()); // модуль свободного члена
   const long MAX_A0_DIVISOR = a0 / 2; // максимальный делитель свободного члена
 
   if (coefList.empty())
      // если пустое уравнение
      return RootList();
 
   for (long 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;
}
 
long getRest(const CoefList& coefList, const long& x0)
{
   long rest = 0;
 
   for (CoefList::const_iterator i = coefList.begin(); i != coefList.end(); ++i)
   {
      rest = x0 * rest + (*i);
   }
 
   return rest;
}
 
Текущее время: 08:22. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru