Технический форум

Технический форум (http://www.tehnari.ru/)
-   Помощь студентам (http://www.tehnari.ru/f41/)
-   -   Помогите с факториалами в С++ (http://www.tehnari.ru/f41/t37880/)

Fishbone 11.07.2010 20:33

Помогите с факториалами в С++
 
Задачка такова:

Дано действительное число x и целое n. Вычислить

x/1!+x3/3!+x5/5!+...+xn/n!

словами
x3 - x в степени 3
x5 - в степени 5
xn - в степени n)

artes33 26.07.2010 04:40

Странно, что никто не ответил, задача элементарная:

#include <iostream>
#include <cmath>

unsigned __int64 fact(unsigned __int64 n)
{
if ((n == 1) || (n == 0))
{
return 1;
}
else
{
return n * fact(n - 1);
}
}

int main()
{
unsigned __int64 n;
label1:
std::cout << "Enter n:\r\n";
std::cin >> n;
if ((n < 1) || (n % 2 == 0))
{
std::cout << "n must be >= 1 and n = 1 (mod 2)\r\n";
goto label1;
}
std::cout << "Enter x:\r\n";
double x;
std::cin >> x;
double summ = 0.0;
for (unsigned __int64 i = 1; i <= n; i += 2)
{
summ += pow(x, (double)i) / fact(i);
}
std::cout << "Result: " << summ << "\r\n\r\n";
return 0;
}

Long Cat 26.07.2010 04:45

Пожалуйста, оформляйте текст программы отступами!
Используйте тег форума CODE.
Указывайте компилятор, не все компиляторы понимают тип __int64.

artes33 26.07.2010 04:48

Сорри, список бб тегов не посмотрел:

Код:

#include <iostream>
#include <cmath>

unsigned __int64 fact(unsigned __int64 n)
{
        if ((n == 1) || (n == 0))
        {
                return 1;
        }
        else
        {
                return n * fact(n - 1);
        }
}

int main()
{
        unsigned __int64 n;
label1:
        std::cout << "Enter n:\r\n";
        std::cin >> n;
                if ((n < 1) || (n % 2 == 0))
                {
                        std::cout << "n must be >= 1 and n = 1 (mod 2)\r\n";
                        goto label1;
                }
        std::cout << "Enter x:\r\n";
        double x;
        std::cin >> x;
        double summ = 0.0;
                for (unsigned __int64 i = 1; i <= n; i += 2)
                {
                        summ += pow(x, (double)i) / fact(i);
                }
        std::cout << "Result: " << summ << "\r\n\r\n";
        return 0;
}


Long Cat 26.07.2010 04:51

Использование меток и безусловных переходов в программах крайне нежелательно.

artes33 26.07.2010 04:53

Есть такое мнение. Но Дональд Кнут писал, что поколения программистов были испорчены запретом на оператор безусловного перехода.

Long Cat 26.07.2010 04:56

А Эдсгер Вайба Дейкстра писал, что квалификация программиста обратно пропорциональна числу использованных меток.

artes33 26.07.2010 05:04

Я не думаю, что обсуждения этого вопроса стоит вести в этом треде. Без этого оператора пришлось совершать бы больше лишних "телодвижений", что привело бы к некоторой потере в производительности. Кроме того, искать спагетти-код в программе из 37 строчек немного некорректно ;).

artes33 26.07.2010 05:11

Можно и без него, конечно:
Код:

#include <iostream>
#include <cmath>

unsigned __int64 fact(unsigned __int64 n)
{
        if ((n == 1) || (n == 0))
        {
                return 1;
        }
        else
        {
                return n * fact(n - 1);
        }
}

int main()
{
        unsigned __int64 n;
                do
                {
                        std::cout << "Enter n (n >= 1 and n = 1 (mod 2)):\r\n\";
                        std::cin >> n;
                } while ((n < 1) || (n % 2 == 0));
        std::cout << "Enter x:\r\n";
        double x;
        std::cin >> x;
        double summ = 0.0;
                for (unsigned __int64 i = 1; i <= n; i += 2)
                {
                        summ += pow(x, (double)i) / fact(i);
                }
        std::cout << "Result: " << summ << "\r\n\r\n";
        return 0;
}


Long Cat 26.07.2010 05:12

Данный раздел предполагает помощь начинающим программистом.
Преследуется цель демонстрации в первую очередь понятного, а уже во вторую - быстрого кода.
Ну и по поводу убыстрения - вызов fact происходит гораздо чаще, а там можно заменить
if ((n == 1) || (n == 0))
на
if (n < 2)


Часовой пояс GMT +4, время: 14:55.

Powered by vBulletin® Version 4.5.3
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.