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

Схема Горнера - C++

Восстановить пароль Регистрация
Другие темы раздела
C++ Матрица. Побочная диагональ http://www.cyberforum.ru/cpp-beginners/thread191652.html
Дана прямоугольная матрица. Определить является ли заданная матрица симметричной относительно побочной диагонали. Начало кода : #include "stdafx.h" #include <stdio.h> #include <conio.h> #include <time.h> #include <Windows.h>
C++ Дано число. Отбросить в нем все цифры, стоящие левее самой правой единицы. вообщем такое задание, "Дано число. Отбросить в нем все цифры, стоящие левее самой правой единицы." вроде легко, но я даже не знаю с чего начинать, может кто помочь код написать? :( http://www.cyberforum.ru/cpp-beginners/thread191644.html
Переменная в разных классах C++
Добрый день уважаемые гуру, у меня есть очень большая проблема. Есть исходники проги написаной на свизуал студии 6, состоят из большого числа сорцов, так вот какая проблема, в одном из сорцов есть переменная, как мне ей воспользоваться в другой части программы? И еще,пытался ее открыть в 10 студии-не открывает, пишет что не может переконвертировать некоторые файлы.
Вопрос по среде разработки эклипс C++
Как добавить существующие исходные файлы в проект?
C++ Произведение неположительных чисел http://www.cyberforum.ru/cpp-beginners/thread191630.html
Дана последовательность целых чисел {Aj} произвольной длины. Найти произве-дение неположительных чисел, наименьшее из неположительных чисел, и номер этого числа в последовательности. #include <stdio.h> #include <conio.h> main() { int j, mi, min, a, kol, pr; clrscr(); printf("zadaite dliny massiva(ne bolee 20 elementov) \n");
C++ Программа для нахождения сопротивления соединения При сопротевлении R1,R2,R3 соединены параллельно. Найти сопротивление соединения. Вот сам код программы подредактируйте его а то не могу понять ошибку. #include <iostream> int main() { double R1, R2, R3; double R; std::cout << "Enter R1: " подробнее

Показать сообщение отдельно
silent_1991
Эксперт C++
4938 / 3014 / 149
Регистрация: 11.11.2009
Сообщений: 7,024
Завершенные тесты: 1
25.11.2010, 16:50     Схема Горнера
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
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
#include <iostream>
 
// Прототипы функций
int Horner(int, int *, int);
int minDiv(int, int);
 
int main()
{
    int *factor;      // Массив коэффициентов уравнения
    int n;            // Степень многочлена
    bool key = false; // Служебный ключ, служит для того, чтобы вывести сообщение
                      // об отсутствии корней, если ни одного корня не найдено
 
    // Вводим степень многочлена
    std::cout << "Enter n: ";
    std::cin >> n;
 
    n++; // Увеличиваем введённую степень на 1 (т.к. в многочлене степени n на самом
         // деле n+1 коэффициент (n коэффициентов + 1 свободный член), и память надо
         // выделить под все коэффициенты)
 
    factor = new int [n]; // Выделяем память под массив коэффициентов
 
    // Вводим с клавиатуры коэффициенты
    for (int i = 0; i < n; i++)
    {
        std::cout << "factor[" << i << "] = ";
        std::cin >> factor[i];
    }
    
    // Запоминаем абсолютное значение (модуль) свободного члена
    int free = factor[n - 1] > 0 ? factor[n - 1] : -factor[n - 1];
 
    // Если свободный член равен нулю
    if (free == 0)
    {
         // Выводим корень "нуль"
        std::cout << "Root: 0" << std::endl;
        
        // Запоминаем, что корень найден, чтобы не выводить сообщение
        // об отсутствии корней
        key = true;
    }
    // Иначе, если свободный член не равен нулю
    else
    {
        // В цикле проходим все числа от нуля до свободного члена
        for (int i = 0; i <= free; i++)
        {
            int root; // Потенциальный корень уравнения
 
            // Находим потенциальный корень с помощью функции minDiv и сравниваем
            // его с нулём (функция вернёт нуль в случае, если не нашла делителей).
            // Если root не равен нулю
            if ((root = minDiv(free, i)) != 0)
            {
                int value; // Значение многочлена в точке root
                
                // Находим значение многочлена в точке root и сравниваем его с нулём.
                // Если значение функции в точке root равно нулю, то root является коренм
                if ((value = Horner(root, factor, n)) == 0)
                {
                    // Выводим найденный корень
                    std::cout << "Root: " << root << std::endl;
                    
                    // Запоминаем, что корень найден, чтобы не выводить сообщение
                    // об отсутствии корней
                    key = true;
                }
 
                // Таким же образом ищем значение многочлена в точке -root (т.к. мы ищем
                // корни среди целых делителей свободного члена, то если root является
                // делителем, то и -root тоже является делителем, и его тоже надо проверить
                // на принадлежность к множеству корней). Т.о. если -root - корень
                if ((value = Horner(-root, factor, n)) == 0)
                {
                    // Выводим его
                    std::cout << "Root: " << -root << std::endl;
                    
                    // И запоминаем, что корень найден, чтобы не выводить сообщение
                    // об отсутствии корней
                    key = true;
                }
                 
                // Делаем скачёк счётчика до значения найденного корня (делителя свободного
                // члена) минус одим, поскольку на промежутке (i; root - 1) явно не будет
                // делителей (ведь функция minDiv, значение которой мы сохраняем в root,
                // находит наименьший целый делитель free, больший i, а значит между
                // root - 1 и i нет других делителей и эти значения мы можем не проверять)
                i = root - 1;
            }
        }
    }
    
    // Если не нашли корней
    if (!key)
        // Сообщаем об этом
        std::cout << "No roots" << std::endl;
 
    // Освобождаем память из-под массива коэффициентов
    delete [] factor;
 
    std::cin.get();
    return 0;
}
 
// Функция, вычисляющая значение многочлена степени n, представленного
// массивом коэффициентов factor в точке x
int Horner(int x, int *factor, int n)
{
    int result = factor[0]; // Запоминаем коэффициент при старшей степени
 
    // Проходим по всем коэффициентам многочлена
    for (int i = 1; i < n; i++)
        // Рассчитываем resul, тоответствующий очередной вложенности скобок
        // разложении многочлена, на котором и основывается метод Горнера
        result = result * x + factor[i];
 
    // Возвращаем рассчитанное значение многочлена в точке x
    return result;
}
 
// Функция, отыскивающая минимальный делитель числа m, больший k
int minDiv(int m, int k)
{
    // Начинаем цикл со значения k+1
    for (int i = k + 1; i < m; i++)
        // Если нашли делитель
        if (m % i == 0)
            // Возвращаем его
            return i;
    
    // Иначе возвращаем нуль (ни в каком другом случае функция нуль не
    // вернёт, поэтому это значение является индикатором того, что
    // делитель не был найден)
    return 0;
}
Саму схему Горнера я описывал выше, поэтому в комментариях подробно в это не вдаюсь, больше опираюсь на описание кода.
 
Текущее время: 17:05. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru