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

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

28.09.2012, 17:02. Показов 5756. Ответов 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
38195 / 21128 / 4309
Регистрация: 12.02.2012
Сообщений: 34,733
Записей в блоге: 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
Ответ Создать тему
Новые блоги и статьи
Программный контроль заполнения реквизита табличной части документа
Maks 02.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "СписаниеМатериалов", разработанного в конфигурации КА2. Задача: реализовать контроль заполнения реквизита табличной части. . .
wmic не является внутренней или внешней командой
Maks 02.04.2026
Решение: DISM / Online / Add-Capability / CapabilityName:WMIC~~~~ Отсюда: https:/ / winitpro. ru/ index. php/ 2025/ 02/ 14/ komanda-wmic-ne-naydena/
Программная установка даты и запрет ее изменения
Maks 02.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "СписаниеМатериалов", разработанного в конфигурации КА2. Задача: при создании документов установить период списания автоматически. . .
Вывод данных в справочнике через динамический список
Maks 01.04.2026
Реализация из решения ниже выполнена на примере нетипового справочника "Спецтехника" разработанного в конфигурации КА2. Задача: вывести данные из ТЧ нетипового документа. . .
Функция заполнения текстового поля в реквизите формы документа
Maks 01.04.2026
Алгоритм из решения ниже реализован на нетиповом документе "ВыдачаОборудованияНаСпецтехнику" разработанного в конфигурации КА2, в дополнении к предыдущему решению. На форме документа создается. . .
К слову об оптимизации
kumehtar 01.04.2026
Вспоминаю начало 2000-х, университет, когда я писал на Delphi. Тогда среди программистов на форумах активно обсуждали аккуратную работу с памятью: нужно было следить за переменными, вовремя. . .
Идея фильтра интернета (сервер = слой+фильтр).
Hrethgir 31.03.2026
Суть идеи заключается в том, чтобы запустить свой сервер, о чём я если честно мечтал давно и давно приобрёл книгу как это сделать. Но не было причин его запускать. Очумелые учёные напечатали на. . .
Модель здравосоХранения 6. ESG-повестка и устойчивое развитие; углублённый анализ кадрового бренда
anaschu 31.03.2026
В прикрепленном документе раздумья о том, как можно поменять модель в будущем
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru