1

Тема: Облислення математичної формули (для числа n)

Задача вирішується мовою програмування C, в IDE Clion.
Чисельник представлений в коді, а от зі знаменником труднощі, бо алгоритм має бути оптимізований, а це означає, що функцію pow використовувати не можна. Весь алгоритм, який описує цю формулу повинен бути зроблений завдяки вкладеним циклам(знаю, що ця умова трохи суперечить визначенності оптимізації).
Текст програми:

#include <stdio.h>

int main() {
    int n, i, j, co; // co=counter operations-лічильник операцій
    double sum, prod, down, result; // sum-сума, prod-добуток, down-у цьому випадку знаменник, result=S
    printf("Enter n:\n");
    scanf("%d", &n);
    prod = 1;
    for(i = 1; i <= n; i++) {
        for(j = 1; j <= i; j++) {
            prod *= (j + 1);
        }
    }
    printf("prod:%f", prod);
    return 0;
}

Математична формула:
S=Sum[Divide[\(40)Product[j+1,{j,1,i}]\(41),Power[\(40)Power[2,i]+1\(41),2]],{i,1,n}]
\sum_{i=1}^{n} \frac{\prod_{j=1}^{i} j+1}{(2^i+1)^2}

2

Re: Облислення математичної формули (для числа n)

dyadykofedir написав:

алгоритм має бути оптимізований, а це означає, що функцію pow використовувати не можна

Уперше чую про такий метод оптимізації. Може, ви якесь інше слово мали на увазі? Чи для оптимізації треба рекурсивну формулу застосувати, а не вкладені цикли?
Знаменник у вас (40*2i+1)2 = 1600*4i + 80 * 2i + 1. Найпростіше буде обчислювати поточні значення 1600*4i і 80 * 2i, домножуючи попередні на 4 і 2 відповідно, десь так:

// перед циклом
double pow2 = 80.0, pow4 = 1600.0;
...
// цикл
for(int i = 1; i <= n; ++i) { // заведіть звичку проголошувати змінну циклу всередині for
    pow2 *= 2.0;
    pow4 *= 4.0;
    double denominator = pow4 + pow2 + 1.0; // знаменник
    ....
}
Подякували: dyadykofedir1

3

Re: Облислення математичної формули (для числа n)

koala написав:
dyadykofedir написав:

алгоритм має бути оптимізований, а це означає, що функцію pow використовувати не можна

Уперше чую про такий метод оптимізації. Може, ви якесь інше слово мали на увазі? Чи для оптимізації треба рекурсивну формулу застосувати, а не вкладені цикли?
Знаменник у вас (40*2i+1)2 = 1600*4i + 80 * 2i + 1. Найпростіше буде обчислювати поточні значення 1600*4i і 80 * 2i, домножуючи попередні на 4 і 2 відповідно, десь так:

// перед циклом
double pow2 = 80.0, pow4 = 1600.0;
...
// цикл
for(int i = 1; i <= n; ++i) { // заведіть звичку проголошувати змінну циклу всередині for
    pow2 *= 2.0;
    pow4 *= 4.0;
    double denominator = pow4 + pow2 + 1.0; // знаменник
    ....
}

формула не правильно перевелась, але задачу вже вирішив сам, має приблизно такий вигляд(з лічильником операцій):

#include <stdio.h>

int main() {
    int n, co = 0, twoInPow = 2; // co=counter operations-лічильник операцій
    double sum = 0, prod, down;  // sum-сума, prod-добуток, down-у цьому випадку знаменник

    printf("Enter n:\n");
    scanf("%d", &n);

    co += 3; // Введення та ініціалізація змінних

    for (int i = 1; i <= n; i++) {
        prod = 1;
        co += 2; // Ініціалізація prod та j

        for (int j = 1; j <= i; j++) {
            prod *= (j + 1);
            co += 4; // Операції у циклі
        }
        co += 2; // Лічильник операцій поза циклом

        down = (twoInPow + 1);
        sum += prod / (down * down);
        twoInPow *= 2;

        co += 6; // Операції підрахунку sum, twoInPow
    }
    printf("result is: %0.7lf\n", sum);
    printf("amount of operations: %d\n", co);
    return 0;
}