Форум программистов, компьютерный форум, киберфорум
Наши страницы

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

Войти
Регистрация
Восстановить пароль
Другие темы раздела
C++ Матрица. Побочная диагональ http://www.cyberforum.ru/cpp-beginners/thread191652.html
Дана прямоугольная матрица. Определить является ли заданная матрица симметричной относительно побочной диагонали. Начало кода : #include "stdafx.h" #include <stdio.h> #include <conio.h>...
C++ Дано число. Отбросить в нем все цифры, стоящие левее самой правой единицы. вообщем такое задание, "Дано число. Отбросить в нем все цифры, стоящие левее самой правой единицы." вроде легко, но я даже не знаю с чего начинать, может кто помочь код написать? :( http://www.cyberforum.ru/cpp-beginners/thread191644.html
Переменная в разных классах C++
Добрый день уважаемые гуру, у меня есть очень большая проблема. Есть исходники проги написаной на свизуал студии 6, состоят из большого числа сорцов, так вот какая проблема, в одном из сорцов есть...
Вопрос по среде разработки эклипс C++
Как добавить существующие исходные файлы в проект?
C++ Произведение неположительных чисел http://www.cyberforum.ru/cpp-beginners/thread191630.html
Дана последовательность целых чисел {Aj} произвольной длины. Найти произве-дение неположительных чисел, наименьшее из неположительных чисел, и номер этого числа в последовательности. #include...
C++ Программа для нахождения сопротивления соединения При сопротевлении R1,R2,R3 соединены параллельно. Найти сопротивление соединения. Вот сам код программы подредактируйте его а то не могу понять ошибку. #include <iostream> int main() { ... подробнее

Показать сообщение отдельно
silent_1991
Эксперт С++
4987 / 3044 / 149
Регистрация: 11.11.2009
Сообщений: 7,027
Завершенные тесты: 1
08.12.2010, 14:51
OffSide, это вообще что у вас? И если препод это одобрил - то сжечь этого препода. Где функция main? И что, cout/cin юзать нельзя, а new/delete - можно? Ещё один идиотизм.

На чистом C это будет выглядеть так:

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
138
139
140
141
142
143
144
#include <stdio.h>
#include <stdlib.h>
 
// Прототипы функций
int Horner(int, int *, int);
int minDiv(int, int);
 
int main()
{
    int *factor; // Массив коэффициентов уравнения
    int n;       // Степень многочлена
    int freeMem; // Свободный член
    int root;    // Потенциальный корень уравнения
    int value;   // Значение многочлена в точке root
    int key = 0; // Служебный ключ, служит для того, чтобы вывести сообщение
                 // об отсутствии корней, если ни одного корня не найдено
    int i;
 
    // Вводим степень многочлена
    printf("Enter n: ");
    scanf("%d", &n);
 
    n++; // Увеличиваем введённую степень на 1 (т.к. в многочлене степени n на самом
         // деле n+1 коэффициент (n коэффициентов + 1 свободный член), и память надо
         // выделить под все коэффициенты)
 
    factor = (int *)malloc(n * sizeof(int)); // Выделяем память под массив коэффициентов
 
    // Вводим с клавиатуры коэффициенты
    for (i = 0; i < n; i++)
    {
        printf("factor[%d] = ", i);
        scanf("%d", &factor[i]);
    }
    
    // Запоминаем абсолютное значение (модуль) свободного члена
    freeMem = factor[n - 1] > 0 ? factor[n - 1] : -factor[n - 1];
 
    // Если свободный член равен нулю
    if (freeMem == 0)
    {
         // Выводим корень "нуль"
        printf("Root: 0\n");
        
        // Запоминаем, что корень найден, чтобы не выводить сообщение
        // об отсутствии корней
        key = 1;
    }
    // Иначе, если свободный член не равен нулю
    else
    {
        // В цикле проходим все числа от нуля до свободного члена
        for (i = 0; i <= freeMem; i++)
        {
            // Находим потенциальный корень с помощью функции minDiv и сравниваем
            // его с нулём. Если root не равен нулю
            if ((root = minDiv(freeMem, i)) != 0)
            {
                // Находим значение многочлена в точке root и сравниваем его с нулём.
                // Если значение функции в точке root равно нулю, то root является коренм
                if ((value = Horner(root, factor, n)) == 0)
                {
                    // Выводим найденный корень
                    printf("Root: %d\n", root);
                    
                    // Запоминаем, что корень найден, чтобы не выводить сообщение
                    // об отсутствии корней
                    key = 1;
                }
 
                // Таким же образом ищем значение многочлена в точке -root (т.к. мы ищем
                // корни среди целых делителей свободного члена, то если root является
                // делителем, то и -root тоже является делителем, и его тоже надо проверить
                // на принадлежность к множеству корней). Т.о. если -root - корень
                if ((value = Horner(-root, factor, n)) == 0)
                {
                    // Выводим его
                    printf("Root: %d\n", -root);
                    
                    // И запоминаем, что корень найден, чтобы не выводить сообщение
                    // об отсутствии корней
                    key = 1;
                }
                 
                // Делаем скачёк счётчика до значения найденного корня (делителя свободного
                // члена) минус одим, поскольку на промежутке (i; root - 1) явно не будет
                // делителей (ведь функция minDiv, значение которой мы сохраняем в root,
                // находит наименьший целый делитель free, больший i, а значит между
                // root - 1 и i нет других делителей и эти значения мы можем не проверять)
                i = root - 1;
            }
            // Иначе, если root равен нулю (т.е. minDiv не нашла делителей, а ведь она ищет
            // все делители вплоть до free), то смысла проверять дальше нету
            else
                // Завершаем цикл
                break;
        }
    }
    
    // Если не нашли корней
    if (key == 0)
        // Сообщаем об этом
        printf("No roots\n");
 
    // Освобождаем память из-под массива коэффициентов
    free(factor);
 
    return 0;
}
 
// Функция, вычисляющая значение многочлена степени n, представленного
// массивом коэффициентов factor в точке x
int Horner(int x, int *factor, int n)
{
    int result = factor[0]; // Запоминаем коэффициент при старшей степени
    int i;
 
    // Проходим по всем коэффициентам многочлена
    for (i = 1; i < n; i++)
        // Рассчитываем resul, тоответствующий очередной вложенности скобок
        // разложении многочлена, на котором и основывается метод Горнера
        result = result * x + factor[i];
 
    // Возвращаем рассчитанное значение многочлена в точке x
    return result;
}
 
// Функция, отыскивающая минимальный делитель числа m, больший k
int minDiv(int m, int k)
{
    int i;
 
    // Начинаем цикл со значения k+1
    for (i = k + 1; i <= m; i++)
        // Если нашли делитель
        if (m % i == 0)
            // Возвращаем его
            return i;
    
    // Иначе возвращаем нуль (ни в каком другом случае функция нуль не
    // вернёт, поэтому это значение является индикатором того, что
    // делитель не был найден)
    return 0;
}
1
 
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru