11.07.2010, 20:33 | #1 (permalink) |
Новичок
Регистрация: 11.07.2010
Сообщений: 1
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Репутация: 10
|
Помогите с факториалами в С++
Дано действительное число x и целое n. Вычислить x/1!+x3/3!+x5/5!+...+xn/n! словами x3 - x в степени 3 x5 - в степени 5 xn - в степени n) |
26.07.2010, 04:40 | #2 (permalink) |
Member
Регистрация: 26.07.2010
Сообщений: 22
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Репутация: 60
|
Странно, что никто не ответил, задача элементарная:
#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; } |
26.07.2010, 04:48 | #4 (permalink) |
Member
Регистрация: 26.07.2010
Сообщений: 22
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Репутация: 60
|
Сорри, список бб тегов не посмотрел:
Код:
#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; } |
26.07.2010, 04:51 | #5 (permalink) |
Banned
Регистрация: 01.09.2009
Сообщений: 4,396
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Репутация: 2544
|
Использование меток и безусловных переходов в программах крайне нежелательно.
|
Ads | |
Member
Регистрация: 31.10.2006
Сообщений: 40200
Записей в дневнике: 0
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Репутация: 55070
|
26.07.2010, 05:04 | #8 (permalink) |
Member
Регистрация: 26.07.2010
Сообщений: 22
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Репутация: 60
|
Я не думаю, что обсуждения этого вопроса стоит вести в этом треде. Без этого оператора пришлось совершать бы больше лишних "телодвижений", что привело бы к некоторой потере в производительности. Кроме того, искать спагетти-код в программе из 37 строчек немного некорректно .
|
26.07.2010, 05:11 | #9 (permalink) |
Member
Регистрация: 26.07.2010
Сообщений: 22
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Репутация: 60
|
Можно и без него, конечно:
Код:
#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; } |
26.07.2010, 05:12 | #10 (permalink) |
Banned
Регистрация: 01.09.2009
Сообщений: 4,396
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Репутация: 2544
|
Данный раздел предполагает помощь начинающим программистом.
Преследуется цель демонстрации в первую очередь понятного, а уже во вторую - быстрого кода. Ну и по поводу убыстрения - вызов fact происходит гораздо чаще, а там можно заменить if ((n == 1) || (n == 0)) на if (n < 2) |
Ads | |
Member
Регистрация: 31.10.2006
Сообщений: 40200
Записей в дневнике: 0
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Репутация: 55070
|
|
|