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

Упрощение и алгоритм

21.01.2012, 17:02. Показов 4386. Ответов 16
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Здрасте есть рекурентное выражение не удаётся упростить для нахождения итератора, (ВСЯ ПРОБЛЕМА - ЭТО ДВОЙНОЙ ФАКТОРИАЛ) и может поправите алгоритм
C++
1
2
3
4
5
6
7
8
9
10
11
double a,c,sum;
    sum = a=c=x;
    k=1;
    while (fabs(c)>esp)
    {
        c = ??; 
        a*=-c;
        sum+=a;
        k++;
    }
    return sum;
Миниатюры
Упрощение и алгоритм  
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
21.01.2012, 17:02
Ответы с готовыми решениями:

Упрощение цикла сортировки элементов массивов. Упрощение цикла поиска нужного элемента в массиве
Уверен, что данный код можно написать компактнее чем есть сейчас. /*Опишите, используя структуру, камеры хранения (номер, индекс...

Нужен алгоритм поиска пути в этом лабиринте (будь то волновой алгоритм или алгоритм правой/левой руки )
#include "stdafx.h" #include <iostream> #include <conio.h> using namespace std; void lab () { int s1 = 0; int s2 =...

Упрощение
На форме есть 33 кнопки , у всех примерно одна и таже процедура нажатия,которая вполне огромная может строк 50, только меняется...

16
DU
1500 / 1146 / 165
Регистрация: 05.12.2011
Сообщений: 2,279
21.01.2012, 17:55
пишете функция нахождения факториала:
C++
1
2
3
4
5
int Factorial(int n)
{
  // вычисления
  return result;
}
Двойной факториал соответственно берется так:
C++
1
int doubleFactorial = Factorial(Factirial(n)); // == n!!
0
Эксперт С++
 Аватар для odip
7176 / 3234 / 82
Регистрация: 17.06.2009
Сообщений: 14,164
21.01.2012, 18:01
Мда, жесть !
Двойной факториал числа n обозначается n!! и определяется как произведение всех натуральных чисел в отрезке [1,n], имеющих ту же чётность что и n.
http://ru.wikipedia.org/wiki/Факториал
1
DU
1500 / 1146 / 165
Регистрация: 05.12.2011
Сообщений: 2,279
21.01.2012, 18:09
Спасибо, не знал. ну в таком случае надо написать отдельную ф-ию двойного факториала

C++
1
2
3
4
5
int DoubleFactorial(n)
{
  // вычисления
  return result;
}
0
0 / 0 / 0
Регистрация: 21.01.2012
Сообщений: 12
21.01.2012, 18:10  [ТС]
Цитата Сообщение от odip Посмотреть сообщение
Мда, жесть !
Двойной факториал числа n обозначается n!! и определяется как произведение всех натуральных чисел в отрезке [1,n], имеющих ту же чётность что и n.
http://ru.wikipedia.org/wiki/Факториал

(2*k)!! = 2^k * k!

8!! = 2^4 * 4! = 384
3!! - ??
0
DU
1500 / 1146 / 165
Регистрация: 05.12.2011
Сообщений: 2,279
21.01.2012, 18:21
ну вот как-то так. Надо будет еще всякие граничные случаи наверно обработать. Так же следить, чтобы результат не вылез за возможности типа лонг. + я не знаю что там при делении должно быть.
но идея должна быть понятна. Далее в своих суммах просто вызываете эти ф-ии.

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
long Factorial(long n)
{
  // ...
  return 0;
}
 
long DoubleFactorial(long n)
{
  if (n % 2)
  {
    //(2*n + 1)! / (2*n)!!
    return Factorial(2 * n + 1) / DoubleFactorial(2 * n);
  }
  else
  {
    // 2^n * n!
    return (2 << (n - 1)) * Factorial(n);
  }
}
0
Эксперт С++
 Аватар для Nameless One
5828 / 3479 / 358
Регистрация: 08.02.2010
Сообщений: 7,448
21.01.2012, 18:22
https://www.cyberforum.ru/cgi-bin/latex.cgi?\frac{a_{k+1}}{a_k} = - \frac{(4(k+1) - 5)!!}{(4(k+1))!!} \, \frac{(4 k) !!}{(4 k - 5)!!} \, x = - \frac{(4k - 1)!!}{(4k+4)!!} \, \frac{(4 k) !!}{(4 k - 5)!!} \, x = - \frac{(4k - 1)!!}{(4 k - 5)!!} \, \frac{(4 k) !!}{(4k+4)!!} \, x = <br />
= - \frac{(4k - 5)!! (4k - 3) (4k - 1)}{(4k - 5)!!} \, \frac{(4k)!!}{(4k)!! (4k + 2) (4k + 4)} \, x = - \frac{(4k - 3) (4k -1)}{(4k + 2)(4k + 4)} \, x

если ничего не напутал, то так (скобки в числителе и знаменателе раскроешь сам)
0
Эксперт С++
 Аватар для Nameless One
5828 / 3479 / 358
Регистрация: 08.02.2010
Сообщений: 7,448
21.01.2012, 18:22
DU, ты, очевидно, не понял, в чем состоит проблема ТС
0
Эксперт С++
 Аватар для odip
7176 / 3234 / 82
Регистрация: 17.06.2009
Сообщений: 14,164
21.01.2012, 18:27
А я вот не пойду зачем вообще считать
https://www.cyberforum.ru/cgi-bin/latex.cgi?\frac{a_{k+1}}{a_k}
0
DU
1500 / 1146 / 165
Регистрация: 05.12.2011
Сообщений: 2,279
21.01.2012, 18:29
ну да. похоже на то. упростить я воспринял как разбить на ф-ии, а не делать как обычно делают все вычисления в теле цикла. Математическое упрощение - не совсем по теме C/C++
Но все равно имея на руках ф-ии вычисления факториалов упрощать особо и не надо ничего. И без упрощения посчитается.
0
Эксперт С++
 Аватар для odip
7176 / 3234 / 82
Регистрация: 17.06.2009
Сообщений: 14,164
21.01.2012, 18:30
Можно на каждом шаге считать (4k-5)!!, (4k)!!, x^k, (-1)^(k-1)
Если при этом использовать значения от предыдущего цикла
то будет достаточно быстро считать

Тогда и преобразования делать не нужно
0
Эксперт С++
 Аватар для odip
7176 / 3234 / 82
Регистрация: 17.06.2009
Сообщений: 14,164
21.01.2012, 18:33
имея на руках ф-ии вычисления факториалов упрощать особо и не надо ничего
Можно и так
Но факториал очень быстро растет от n
Для хранения результата очень скоро станет мало long int
13 ! = 6 227 020 800
уже не влазит
0
Эксперт С++
 Аватар для Nameless One
5828 / 3479 / 358
Регистрация: 08.02.2010
Сообщений: 7,448
21.01.2012, 18:35
Цитата Сообщение от odip Посмотреть сообщение
А я вот не пойду зачем вообще считать
https://www.cyberforum.ru/cgi-bin/latex.cgi?\frac{a_{k+1}}{a_k}
чтобы выразить https://www.cyberforum.ru/cgi-bin/latex.cgi?a_{k+1} через https://www.cyberforum.ru/cgi-bin/latex.cgi?a_k
Цитата Сообщение от odip Посмотреть сообщение
Можно на каждом шаге считать (4k-5)!!, (4k)!!, x^k, (-1)^(k-1), (-1)^k
Если при этом использовать значения от предыдущего цикла
то будет достаточно быстро считать
ну да, в принципе, хотя эти вычисления как раз и будут аналогичны вычислению
https://www.cyberforum.ru/cgi-bin/latex.cgi?\frac{a_{k+1}}{a_k} = - \frac{(4k - 3) (4k -1)}{(4k + 2)(4k + 4)} \, x
0
Эксперт С++
 Аватар для Nameless One
5828 / 3479 / 358
Регистрация: 08.02.2010
Сообщений: 7,448
21.01.2012, 18:46
Цитата Сообщение от DU Посмотреть сообщение
Математическое упрощение - не совсем по теме C/C++
Но все равно имея на руках ф-ии вычисления факториалов упрощать особо и не надо ничего. И без упрощения посчитается.
а тебя не смущает, что это неэффективно? И что при таком подходе одни и те же факториалы будут вычисляться несколько раз? Нет, конечно, можно вручную кешировать значения функций, но зачем? Да и про переполнение целого типа тебе уже сказали
0
0 / 0 / 0
Регистрация: 21.01.2012
Сообщений: 12
22.01.2012, 14:43  [ТС]
Вот условие:

Вывести на экран таблицу значений функции Y(x) и её разложение в ряд S(x) с точностью до E. Вывести число итераций, необходимое для достижения заданной точности. Вычисление S(x) и Y(x) оформить в виде функций.

условие прикреплено (скрин 1): нумерация столбцов:
1 - начало промежутка
2 - конец промежутка
3 - сумма
4 - точность
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
#include <iostream.h>
#include <math.h>
#include <iomanip.h>
    
    typedef double (*uf)(double, double, int &);
 
void tabl(double, double, double, double, uf);
double y(double, double, int &);
double s(double, double, int &);
 
 
int main()
{
    cout << setw(8) << "x" << setw(15) << "y(x)" << setw(10) << "k" << endl;
    tabl(-0.8, 0.9, 0.1, 0.0001, y);
    cout << endl;
    cout << setw(8) << "x" << setw(15) << "s(x)" << setw(10) << "k" << endl;
    tabl(-0.8, 0.9, 0.1, 0.0001, s);
    return 0;
}
 
 
void tabl(double a, double b, double h, double esp, uf fun)
{
    int k=0;    
    double sum;
    for (double x=a; x<b+h/2; x+=h)
    {
        sum = fun(x, esp, k);
        cout << setw(8) << x << setw(15) << sum << setw(10) << k << endl;
    }
}
 
double y(double x, double esp, int &k)
{
    return pow(x+1,1/4.) - (4-x) / 4.;
}
 
double s(double x, double esp, int &k)
{
    double a,c,sum;
    sum = a = c =  - (x*x) / 128.; 
    k=3;
    while (fabs(c)>esp)
    {
        c =  (-1.0) * ((4*k-3)*(4*k-1))/((4*k+4)*(4*k+2)) * x;  // pow(x,2) / (2*k*(2*k+1));    
        a*=-c;
        sum+=a;
        k++;
    }
    return sum;
}
получается какая-та фигня (скрин2)
Миниатюры
Упрощение и алгоритм   Упрощение и алгоритм  
0
0 / 0 / 0
Регистрация: 21.01.2012
Сообщений: 12
23.01.2012, 15:32  [ТС]
Быть может неверно рассчитано первое слагаемое суммы?? Дайте совет!!
0
Эксперт С++
 Аватар для Nameless One
5828 / 3479 / 358
Регистрация: 08.02.2010
Сообщений: 7,448
23.01.2012, 17:09
Немного исправил твою функцию, считающую данное выражение через разложение в ряд:
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
#include <stdio.h>
#include <stdlib.h>
#include <math.h>
 
#define FIELD_WIDTH 15
#define SEPARATOR(CNT)              \
    do {                    \
    size_t i, j;                \
    putchar('+');               \
    for(i = 0; i < CNT; ++i, putchar('+'))  \
    for(j = 0; j < FIELD_WIDTH; ++j)        \
    putchar('-');               \
    putchar('\n');              \
    } while(0)
    
typedef double (*func_t)(double, double, size_t*);
 
void tabulate(double min, double max, double step,
          double tol, func_t fun, func_t expansion)
{
    /* display header */
    SEPARATOR(4);
    printf("|%*s |%*s |%*s |%*s |\n", FIELD_WIDTH - 1, "x",
       FIELD_WIDTH - 1, "y(x)", FIELD_WIDTH - 1, "s(x)",
       FIELD_WIDTH - 1, "k");
    SEPARATOR(4);
 
    for(; min <= max; min += step)
    {
    size_t step_counter;
    double fun_value = fun(min, tol, NULL),
        exp_value = expansion(min, tol, &step_counter);
 
    printf("|%-*.1f|%-*.5f|%-*.5f|%-*zu|\n", FIELD_WIDTH, min,
           FIELD_WIDTH, fun_value, FIELD_WIDTH, exp_value,
           FIELD_WIDTH, step_counter);
    SEPARATOR(4);
    }
}
 
double y(double x, double tol, size_t* ptr_cnt)
{
    return pow(x + 1, .25) + (x - 4) / 4.;
}
 
double s(double x, double tol, size_t* ptr_cnt)
{
    double sum, addend;
    
    sum = 0;
    addend = - (x * x) / 128.;
 
    *ptr_cnt = 2;
 
    while(fabs(addend) > tol)
    {
    double k = *ptr_cnt;
    sum += addend;
    addend *= (- x) * ((4 * k - 3) * (4 * k - 1)) / ((4 * k + 2) * (4 * k + 4));
    
    ++(*ptr_cnt);
    }
 
    return sum;
}
 
int main(void)
{
    tabulate(-.8, .9, .1, 1e-4, y, s);
            
    exit(0);
}
Но у меня тоже значения функции и ее разложения не совпадают.
Мне кажется, что у тебя в задании дано неправильное разложение функции в ряд. Об этом можно судить аналитически:
при https://www.cyberforum.ru/cgi-bin/latex.cgi?|x| < 1 ряд будет убывающим по модулю. Первое слагаемое ряда (а оно у тебя посчитано правильно) на несколько порядков меньше (по модулю) значения функции. Т.к. для данных https://www.cyberforum.ru/cgi-bin/latex.cgi?x у тебя каждый последующий член ряда будет еще меньше (по модулю), а ряд — знакочередующийся, то очевидно, что модуль суммы ряда не превысит модуля первого слагаемого (которое много меньше точного значения функции).
Уточни у преподавателя задание. Может действительно разложение неправильное или под двойным факториалом в данном случае подразумевается что-то другое.
PS. То, что выражение https://www.cyberforum.ru/cgi-bin/latex.cgi?\frac{a_{k+1}}{a_k} правильное, можно доказать, а в том, что функция s считает именно заданную сумму, можно убедиться, вручную посчитав несколько первых слагаемых суммы и сравнив их со значениями, которые можно просмотреть в отладчике
1
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
23.01.2012, 17:09
Помогаю со студенческими работами здесь

упрощение
можно ли упростить данное условие? if($w==&quot;test1&quot; || $w==&quot;tester&quot; || $w==&quot;for&quot; || $w==&quot;of&quot; || $w==&quot;if&quot; || $w==&quot;reset&quot; ||...

Упрощение
Добрый вечер. При использовании функции подстановки у меня получился очень длинный и страшный результат. Есть ли в матлабе какая-нибудь...

Упрощение схемы
Здравствуйте!Мне нужна небольшая помощь-правильно ли я перерисовываю схему.просто хочу её начертить так,чтобы потом с ней проще было...

Упрощение выражений
Такое задание: Создать процедуру simplify (+Expr,–Result), которая выполняет упрощение выражений, содержащих тангенс от суммы...

Упрощение синтаксиса
Здравствуйте, как упростить данный код? if CheckBox1.Checked=true then Form2.Edit1.Enabled:=True; if CheckBox1.Checked=true then...


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

Или воспользуйтесь поиском по форуму:
17
Ответ Создать тему
Новые блоги и статьи
Thinkpad X220 Tablet — это лучший бюджетный ноутбук для учёбы, точка.
Programma_Boinc 23.12.2025
Thinkpad X220 Tablet — это лучший бюджетный ноутбук для учёбы, точка. Рецензия / Мнение Это мой обзор планшета X220 с точки зрения школьника. Недавно я решила попытаться уменьшить свой. . .
PhpStorm 2025.3: WSL Terminal всегда стартует в ~
and_y87 14.12.2025
PhpStorm 2025. 3: WSL Terminal всегда стартует в ~ (home), игнорируя директорию проекта Симптом: После обновления до PhpStorm 2025. 3 встроенный терминал WSL открывается в домашней директории. . .
Как объединить две одинаковые БД Access с разными данными
VikBal 11.12.2025
Помогите пожалуйста !! Как объединить 2 одинаковые БД Access с разными данными.
Новый ноутбук
volvo 07.12.2025
Всем привет. По скидке в "черную пятницу" взял себе новый ноутбук Lenovo ThinkBook 16 G7 на Амазоне: Ryzen 5 7533HS 64 Gb DDR5 1Tb NVMe 16" Full HD Display Win11 Pro
Музыка, написанная Искусственным Интеллектом
volvo 04.12.2025
Всем привет. Некоторое время назад меня заинтересовало, что уже умеет ИИ в плане написания музыки для песен, и, собственно, исполнения этих самых песен. Стихов у нас много, уже вышли 4 книги, еще 3. . .
От async/await к виртуальным потокам в Python
IndentationError 23.11.2025
Армин Ронахер поставил под сомнение async/ await. Создатель Flask заявляет: цветные функции - провал, виртуальные потоки - решение. Не threading-динозавры, а новое поколение лёгких потоков. Откат?. . .
Поиск "дружественных имён" СОМ портов
Argus19 22.11.2025
Поиск "дружественных имён" СОМ портов На странице: https:/ / norseev. ru/ 2018/ 01/ 04/ comportlist_windows/ нашёл схожую тему. Там приведён код на С++, который показывает только имена СОМ портов, типа,. . .
Сколько Государство потратило денег на меня, обеспечивая инсулином.
Programma_Boinc 20.11.2025
Сколько Государство потратило денег на меня, обеспечивая инсулином. Вот решила сделать интересный приблизительный подсчет, сколько государство потратило на меня денег на покупку инсулинов. . . .
Ломающие изменения в C#.NStar Alpha
Etyuhibosecyu 20.11.2025
Уже можно не только тестировать, но и пользоваться C#. NStar - писать оконные приложения, содержащие надписи, кнопки, текстовые поля и даже изображения, например, моя игра "Три в ряд" написана на этом. . .
Мысли в слух
kumehtar 18.11.2025
Кстати, совсем недавно имел разговор на тему медитаций с людьми. И обнаружил, что они вообще не понимают что такое медитация и зачем она нужна. Самые базовые вещи. Для них это - когда просто люди. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru