Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.69/29: Рейтинг темы: голосов - 29, средняя оценка - 4.69
0 / 0 / 0
Регистрация: 27.09.2012
Сообщений: 5

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

28.09.2012, 17:02. Показов 5704. Ответов 5
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Здравствуйте, помогите мне разобраться с одной проблемой. Мне надо написать программу, которая находит целые корни многочлена по схеме Горнера, через делите свободного члена. Программа считает, но в ответе постоянно выдает ответ "нет".
Программа:
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
//---------------------------------------------------------------------------
#include <iostream>
#include <conio.h>
#include <vcl.h>
#include <tchar.h>
#include <vcl.h>
#pragma hdrstop
 
//---------------------------------------------------------------------------
#pragma argsused
using namespace std;
char bufRus[256];
 
char *Rus(const char *text)
{
    CharToOem(text, bufRus);
    return bufRus;
}
 
int main(int argc, char *argv[])
{
    register unsigned int i;
    unsigned int n;
 
    cout << Rus("Введите количество элементов: ");
    cin >> n;                        //4
 
    if (n < 1) {
        cerr << Rus("Требуется хотя бы два элемента.") << endl;
        return EXIT_FAILURE;
    }
 
    double *a = new double[n];
    double *b = new double[n];
 
    cout << Rus("Введите делитель свободного члена: ");
    double c;
    cin >> c;                        // 2
 
    cout << Rus("Введите исходн. элем.:") << endl;
    for (i = 0; i < n; i++)
        cin >> a[i];
 
    cout << endl;                // 1 -1 -8 12
 
    /* Рисуем верхнюю рамку */
    for (i = 0; i < n; i++)
        cout << "+-------";
    cout << "+" << endl;
 
    /* Выводим исходные элементы */
    for (i = 0; i < n; i++)
        cout << "| " << a[i] << "t";
    cout << "|" << endl;
 
    /* Снова рамка */
    for (i = 0; i < n; i++)
        cout << "+-------";
    cout << "+" << endl;
 
    /* По условию, первый элемент b равен первому элементу a */
    b[0] = a[0];
    cout << "| " << *b << "t";
    for (i = 1; i < n; i++) {
        b[i] = b[i - 1] * c;
        /* В этом месте b[i] будет равно значению, записываемому во вторую строчку */
        b[i] += a[i];
        cout << "| " << b[i] << "t";
    }
    cout << "+" << endl;
 
    /* И ещё одна завершающая рамка */
    for (i = 0; i < n; i++)
        cout << "+-------";
    cout << "+" << endl << endl;
    if (b[n - 1] == 0)
        cout << Rus("Ответ: ") << c << endl;
    else
        cout << Rus("Ответ: нет");
    delete[]b;
    delete[]a;
    getch();
}
 
//---------------------------------------------------------------------------
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
28.09.2012, 17:02
Ответы с готовыми решениями:

Вычисление значений многочлена по схеме Горнера методом сдваивания
Ребят как задается реккурентное соотношение для функции?, алгоритм вычисления по схеме горнера у меня есть, но нужно привести мою ф-ию...

Программа нахождения корней многочлена методом хорд
СРОЧНО! Программа нахождения корней многочлена методом хорд. Функции sinx,cosx,tgx,ctgx,lnx должны корректно выдавать ответы!!! Помогите!...

Нахождение корней методом Ньютона
Нужно написать программу вычисляющую корень полинома методом Ньютона. Подскажите, как можно описать функцию...

5
Супер-модератор
Эксперт функциональных языков программированияЭксперт Python
 Аватар для Catstail
38167 / 21102 / 4307
Регистрация: 12.02.2012
Сообщений: 34,690
Записей в блоге: 14
28.09.2012, 21:29
Два раза просмотрел код... Рисование рамок, ввод и вывод вижу. А где же собственно решение?
0
 Аватар для Buckstabue
179 / 127 / 25
Регистрация: 12.01.2012
Сообщений: 623
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;
}
1
0 / 0 / 0
Регистрация: 27.09.2012
Сообщений: 5
01.10.2012, 16:11  [ТС]
А может есть у кого-нибудь на C++?
0
 Аватар для CableGuy
15 / 15 / 2
Регистрация: 29.03.2012
Сообщений: 41
01.10.2012, 16:21
Схема Горнера(
Вот, недавно создавалась подобная тема, там я выложил код программы и прокомментировал её.
1
 Аватар для Buckstabue
179 / 127 / 25
Регистрация: 12.01.2012
Сообщений: 623
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;
}
1
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
01.10.2012, 17:12
Помогаю со студенческими работами здесь

Нахождение комплексных корней методом Ньютона
Нужно решить уравнение с комплексной переменной z^n +1 = 0. Код вроде написал,но ищет неверно корни.Помогите,пожалуйста. Заголовочный...

Нахождение корней уравнения методом обратного интерполирования
Pomogite pojaluista napisat na C++ . . . zARANEE sPASIBO :)))

Нахождение корней уравнения методом обратного интерполирования
Помощь нужна! кто можеть помогите

Нахождение корней многочлена методом хорд
есть код программы на dev c++ помогите мне сделать ее на builder c++. Или дайте рекомендации как сделать Программу нахождения корней...

Небольшая задачка. Нахождение корней многочлена.
Здравствуйте скажу сразу в области javascript не силен, есть набросок скрипта для нахождения корней многочлена, но она почему-то не...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
6
Ответ Создать тему
Новые блоги и статьи
http://iceja.net/ математические сервисы
iceja 20.01.2026
Обновила свой сайт http:/ / iceja. net/ , приделала Fast Fourier Transform экстраполяцию сигналов. Однако предсказывает далеко не каждый сигнал (см ограничения http:/ / iceja. net/ fourier/ docs ). Также. . .
http://iceja.net/ сервер решения полиномов
iceja 18.01.2026
Выкатила http:/ / iceja. net/ сервер решения полиномов (находит действительные корни полиномов методом Штурма). На сайте документация по API, но скажу прямо VPS слабенький и 200 000 полиномов. . .
Расчёт переходных процессов в цепи постоянного тока
igorrr37 16.01.2026
/ * Дана цепь постоянного тока с R, L, C, k(ключ), U, E, J. Программа составляет систему уравнений по 1 и 2 законам Кирхгофа, решает её и находит переходные токи и напряжения на элементах схемы. . . .
Восстановить юзерскрипты Greasemonkey из бэкапа браузера
damix 15.01.2026
Если восстановить из бэкапа профиль Firefox после переустановки винды, то список юзерскриптов в Greasemonkey будет пустым. Но восстановить их можно так. Для этого понадобится консольная утилита. . .
Сукцессия микоризы: основная теория в виде двух уравнений.
anaschu 11.01.2026
https:/ / rutube. ru/ video/ 7a537f578d808e67a3c6fd818a44a5c4/
WordPad для Windows 11
Jel 10.01.2026
WordPad для Windows 11 — это приложение, которое восстанавливает классический текстовый редактор WordPad в операционной системе Windows 11. После того как Microsoft исключила WordPad из. . .
Classic Notepad for Windows 11
Jel 10.01.2026
Old Classic Notepad for Windows 11 Приложение для Windows 11, позволяющее пользователям вернуть классическую версию текстового редактора «Блокнот» из Windows 10. Программа предоставляет более. . .
Почему дизайн решает?
Neotwalker 09.01.2026
В современном мире, где конкуренция за внимание потребителя достигла пика, дизайн становится мощным инструментом для успеха бренда. Это не просто красивый внешний вид продукта или сайта — это. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru