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

Бином Ньютона (Задачник А.Г.Юркин) - C++

Восстановить пароль Регистрация
 
Рейтинг: Рейтинг темы: голосов - 11, средняя оценка - 4.73
InSperrO
1 / 1 / 0
Регистрация: 10.09.2012
Сообщений: 24
22.12.2012, 18:04     Бином Ньютона (Задачник А.Г.Юркин) #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
#include "stdafx.h"
#include <iostream>
#include <math.h>
#include <conio.h>
using namespace std;
 
// Определение функции 1
double calc_binom_1 (double x, int m)
{
    return pow((1+x),m);
}
 
// Определение функции 2
double calc_binom_2 (double x, int m)
{
    int i;
    double calc;
    double ci,ci1,sum;
    if (x==0)
    {
        calc=1;
        cout << calc;
    }
    i=1;
    ci=1;
    sum=1;
    while (i<=m)
    {
        ci1=ci*(m-i+1.0)/i;
        sum=sum+ci1*pow(x,i);
        ci=ci1;
        i=i+1;
    }
    calc=sum;
    return calc;
}
 
void main()
{
    double x;
    int m;
    setlocale(LC_ALL,"Russian");
    cout << "Введите" << endl;
    cout << "x = ";
    cin >> x;
    cout << "m = ";
    cin >> m;
    cout << "Результат:" << endl;
    cout << "Бином Ньютона (1+x)^m = " << calc_binom_1(x,m) << endl;
    cout << "Бином Ньютона (разложение в ряд) = " << calc_binom_2(x,m) << endl;
    getch();
}
Спасибо!
Миниатюры
Бином Ньютона (Задачник А.Г.Юркин)  
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
22.12.2012, 18:04     Бином Ньютона (Задачник А.Г.Юркин)
Посмотрите здесь:

C++ Задачник по С++
Задачник C++
Бином C++
Задачник по C/C++ C++
Задачник по c++ C++
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
InSperrO
1 / 1 / 0
Регистрация: 10.09.2012
Сообщений: 24
22.12.2012, 19:43  [ТС]     Бином Ньютона (Задачник А.Г.Юркин) #2
Я попробовал решить ее с помощью рекуррентного соотношения.

Если использовать классическую формулу, она будет эффективнее?
radamaerl
27 / 6 / 1
Регистрация: 20.12.2012
Сообщений: 39
22.12.2012, 22:45     Бином Ньютона (Задачник А.Г.Юркин) #3
смотря что ты для себя считаешь эффективностью))
можно разве что сразу написать вместо
C++
1
2
3
4
5
if (x==0)
    {
        calc=1;
        cout << calc;
    }
C++
1
if (x==0) return 1;
и все
InSperrO
1 / 1 / 0
Регистрация: 10.09.2012
Сообщений: 24
22.12.2012, 23:10  [ТС]     Бином Ньютона (Задачник А.Г.Юркин) #4
Цитата Сообщение от radamaerl Посмотреть сообщение
смотря что ты для себя считаешь эффективностью))
можно разве что сразу написать вместо
C++
1
2
3
4
5
if (x==0)
    {
        calc=1;
        cout << calc;
    }
C++
1
if (x==0) return 1;
и все
Спасибо!

Да, это тоже можно к этому отнести Все, что упростит код - хорошо. Т.к. еще нет навыков.

Вопрос про эффективность:

C++
1
ci1=ci*(m-i+1.0)/i;
Какой метод лучше и легче, чтобы найти ci1?

Рекуррентное соотношение или с помощью факториалов?

И как написать код с помощью факториалов (что-то пока не получается)?
Миниатюры
Бином Ньютона (Задачник А.Г.Юркин)  
InSperrO
1 / 1 / 0
Регистрация: 10.09.2012
Сообщений: 24
23.12.2012, 00:03  [ТС]     Бином Ньютона (Задачник А.Г.Юркин) #5
Подниму тему последний раз.

Если входные данные будут большими, при расчете факториалов это будет слишком трудоемко?
Wolkodav
 Аватар для Wolkodav
599 / 452 / 32
Регистрация: 18.09.2012
Сообщений: 1,685
23.12.2012, 00:09     Бином Ньютона (Задачник А.Г.Юркин) #6
Вообще факториал сам по себе не столько трудоёмкий, сколько памяти ёмкий. Просто уже на 30 шаге получаются большие числа и за пределы можно очень быстро выскочить. А так трудоёмкость факториала циклом=N.(могу ошибаться)
Рекурсией будет побыстрее наверно но память еще больше скушаеться.
InSperrO
1 / 1 / 0
Регистрация: 10.09.2012
Сообщений: 24
23.12.2012, 00:53  [ТС]     Бином Ньютона (Задачник А.Г.Юркин) #7
Возник еще один вопрос:

Как видно в коде, x и m ввел с клавиатуры.
C++
1
2
3
4
5
cout << "Введите" << endl;
cout << "x = ";
cin >> x;
cout << "m = ";
cin >> m;
А как сделать так, чтобы входные данные вводились из текстового файла?

- в директории "/debug" создал текстовый файл "binom.txt";
- записал данные для x и m;
- подключил заголовочный файл #include <fstream>;
- как прочитать этот файл и вывести данные из него? мне нужно создать одномерный массив?
Миниатюры
Бином Ньютона (Задачник А.Г.Юркин)  
radamaerl
27 / 6 / 1
Регистрация: 20.12.2012
Сообщений: 39
23.12.2012, 01:23     Бином Ньютона (Задачник А.Г.Юркин) #8
по поводу улучшения кода
убраны лишние переменные
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
double calc_binom_2 (double x, int m)
{
    int i;
    double calc;
    double ci;
    if (x==0||m==0) return 1;
    i=0;
    ci=1;
    calc=0;
    while (i<=m)
    {
        calc=calc+ci*pow(x,i);
        ci=ci*(m-i)/(i+1);
        i++;
    }
    return calc;
}
ну и вобще как рекурсия на перспективу
C++
1
2
3
4
5
6
7
double calc_binom_3 (double x, int m)
{
   
    if (m==1) return 1+x;
    return calc_binom_3 ( x, m-1)*(1+x);
    
}
InSperrO
1 / 1 / 0
Регистрация: 10.09.2012
Сообщений: 24
23.12.2012, 01:42  [ТС]     Бином Ньютона (Задачник А.Г.Юркин) #9
radamaerl, спасибо!
Kuzia domovenok
 Аватар для Kuzia domovenok
1882 / 1737 / 116
Регистрация: 25.03.2012
Сообщений: 5,907
Записей в блоге: 1
23.12.2012, 01:50     Бином Ньютона (Задачник А.Г.Юркин) #10
по идее для оптимизации вычислений нужно
перестать использовать функцию pow для вычисления степени х, вместо этого домножать предыдущую полученную степень на х
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
23.12.2012, 02:15     Бином Ньютона (Задачник А.Г.Юркин)
Еще ссылки по теме:

C++ Задачник по С++
Задачник по С++ C++
C++ Задачник по С++

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

Или воспользуйтесь поиском по форуму:
InSperrO
1 / 1 / 0
Регистрация: 10.09.2012
Сообщений: 24
23.12.2012, 02:15  [ТС]     Бином Ньютона (Задачник А.Г.Юркин) #11
Цитата Сообщение от Kuzia domovenok Посмотреть сообщение
по идее для оптимизации вычислений нужно
перестать использовать функцию pow для вычисления степени х, вместо этого домножать предыдущую полученную степень на х
Да, подумаю над этим.

При Вашей помощи пока получилось вот так:

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
#include "stdafx.h"
#include <iostream>
#include <fstream>
#include <math.h>
#include <conio.h>
using namespace std;
 
// Определение функции 1
double calc_binom_1 (double x, int m)
{
    return pow((1+x),m);
}
 
// Определение функции 2
double calc_binom_2 (double x, int m)
{
    int i;
    double calc;
    double ci;
    if (m==0||m==0) return 1;
    i=0;
    ci=1;
    calc=0;
    while (i<=m)
    {
        calc=calc+ci*pow(x,i);
        ci=ci*(m-i)/(i+1);
        i++;
    }
    return calc;
}
 
int main()
{
    double x;
    int m;
    setlocale(LC_ALL,"Russian");
    // Текстовый вывод
    ofstream out("binom");
    out << 2 << " " << 3 << "\n";
    out.close();
    // Текстовый ввод
    ifstream in("binom");
    in >> x;
    in >> m;
    in.close();
    // Результаты
    cout << "Результат:" << endl;
    cout << "Бином Ньютона (1+x)^m = " << calc_binom_1(x,m) << endl;
    cout << "Бином Ньютона (разложение в ряд) = " << calc_binom_2(x,m) << endl;
    getch();
}
Кажется все работает. Спасибо всем!
Yandex
Объявления
23.12.2012, 02:15     Бином Ньютона (Задачник А.Г.Юркин)
Ответ Создать тему
Опции темы

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