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

Решение куб. уравнения. - C++

Восстановить пароль Регистрация
 
Рейтинг: Рейтинг темы: голосов - 12, средняя оценка - 4.67
Kuzia domovenok
 Аватар для Kuzia domovenok
1882 / 1737 / 116
Регистрация: 25.03.2012
Сообщений: 5,907
Записей в блоге: 1
27.04.2012, 21:59     Решение куб. уравнения. #1
решение кубического уравнения.
Программа работает слишком медленно. (Не знаю в каком месте медленно, как по мне - так нормально)
Есть кубическое уравнение вида A*X3 + B*X2 + C*X + D = 0. все корни уравнений – целые числа и находятся на отрезке [-100, 100]. написать программу, которая поможет ему найти корни кубических уравнений!
Я пишу так.
Как известно, целочисленные корни уравнения являются делителями свободного члена (или что-то в этом роде, не помню). Так вот.
Если D=0, сначала вывожу 0 и отбрасываю нулевые корни. Затем беру в качестве свободного члена последний ненулевой коэффициент.
В цикле нахожу все его делители j, меньшие или равные корню из свободного члена (while (j*j<=N)){if(N%j==0){...}j++;}
заношу их в массив d[].
парные им делители будут N/d[]
И, наконец, в цикле проверяю числа -N/d[i], -d[i], d[i], N/d[i] , нет ли среди них корней уравнения.
Разве это не оптимальный алгоритм? Но мне сказали, что не проходит какой-то "тест" по времени.
Есть идеи в чём проблема? Считает всё правильно и шустро.
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
#include <stdio.h>
int i, N, sz, j;
int a[4]={0};
int d1[10], d2[10];
inline int test(int x){
    return x*x*x*a[0]+x*x*a[1]+x*a[2]+a[3];
}
 
int main(){//19:02 27.04 not shown
    freopen("INPUT.TXT", "r", stdin);
    freopen("OUTPUT.TXT", "w", stdout);
    scanf("%d %d %d %d", a, a+1, a+2, a+3);
    i=3;
    if (!a[3]){
        printf("0 ");
        while((!a[i])&&i)
            i--;
        if (!i) 
            return 0;
    }
    N=(a[i]>0)?a[i]:-a[i];
    sz=0; j=2;
    d1[0]=1; 
    while((j*j<=N)&&(j<=100)){
        if ((N%j)==0){
            sz++;
            d1[sz]=j;//root
            d2[sz]=N/j;
        }
        j++;
    }
    if ((j-1)*(j-1)==N){d2[sz]=N+1;}
    for(j=0; j>=sz; j++){
        if(test(-d2[j])==0)
            printf("%d ", -d2[j]);
    }
    for(j=sz; j>=0; j--){
        if(test(-d1[j])==0)
            printf("%d ", -d1[j]);
    }
    for(j=0; j<=sz; j++){
        if(test(d1[j])==0)
            printf("%d ", d1[j]);
    }
    for(j=sz; j>=0; j--){
        if(test(d2[j])==0)
            printf("%d ", d2[j]);
    }
}
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
27.04.2012, 21:59     Решение куб. уравнения.
Посмотрите здесь:

C++ Решение уравнения
решение уравнения C++
Решение уравнения C++
Решение уравнения C++
Решение нелинейного уравнения C++
Решение уравнения C++
Решение уравнения C++
C++ Решение уравнения

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

Или воспользуйтесь поиском по форуму:
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
UFO94
 Аватар для UFO94
263 / 252 / 13
Регистрация: 04.04.2012
Сообщений: 546
27.04.2012, 22:19     Решение куб. уравнения. #2
Ну, мне кажется, что нужно найти только 1 корень, а потом облегчить работу компьютеру своим мозгом, решив квадратное уравнение аналитически -- дискриминант и т.д.

Не по теме:

Кстати, если интересно, могу рассказать метод нахождения корней многочлена (не целых) произвольной степени на произвольном промежутке (в том числе на всей числовой оси). Работает быстро и точно.

Yandex
Объявления
27.04.2012, 22:19     Решение куб. уравнения.
Ответ Создать тему
Опции темы

Текущее время: 11:14. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru