Технический форум
Вернуться   Технический форум > Программирование > Форум программистов > Помощь студентам


Ответ
 
Опции темы Опции просмотра
Старый 11.07.2010, 20:33   #1 (permalink)
Fishbone
Новичок
 
Регистрация: 11.07.2010
Сообщений: 1
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Репутация: 10
Exclamation Помогите с факториалами в С++

Задачка такова:

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

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

словами
x3 - x в степени 3
x5 - в степени 5
xn - в степени n)
Fishbone вне форума   Ответить с цитированием
Старый 26.07.2010, 04:40   #2 (permalink)
artes33
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;
}
artes33 вне форума   Ответить с цитированием
Старый 26.07.2010, 04:45   #3 (permalink)
Long Cat
Banned
 
Регистрация: 01.09.2009
Сообщений: 4,396
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Репутация: 2544
По умолчанию

Пожалуйста, оформляйте текст программы отступами!
Используйте тег форума CODE.
Указывайте компилятор, не все компиляторы понимают тип __int64.
Long Cat вне форума   Ответить с цитированием
Старый 26.07.2010, 04:48   #4 (permalink)
artes33
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;
}
artes33 вне форума   Ответить с цитированием
Старый 26.07.2010, 04:51   #5 (permalink)
Long Cat
Banned
 
Регистрация: 01.09.2009
Сообщений: 4,396
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Репутация: 2544
По умолчанию

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

Яндекс

Member
 
Регистрация: 31.10.2006
Сообщений: 40200
Записей в дневнике: 0
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Репутация: 55070
Старый 26.07.2010, 04:53   #6 (permalink)
artes33
Member
 
Регистрация: 26.07.2010
Сообщений: 22
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Репутация: 60
По умолчанию

Есть такое мнение. Но Дональд Кнут писал, что поколения программистов были испорчены запретом на оператор безусловного перехода.
artes33 вне форума   Ответить с цитированием
Старый 26.07.2010, 04:56   #7 (permalink)
Long Cat
Banned
 
Регистрация: 01.09.2009
Сообщений: 4,396
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Репутация: 2544
По умолчанию

А Эдсгер Вайба Дейкстра писал, что квалификация программиста обратно пропорциональна числу использованных меток.
Long Cat вне форума   Ответить с цитированием
Старый 26.07.2010, 05:04   #8 (permalink)
artes33
Member
 
Регистрация: 26.07.2010
Сообщений: 22
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Репутация: 60
По умолчанию

Я не думаю, что обсуждения этого вопроса стоит вести в этом треде. Без этого оператора пришлось совершать бы больше лишних "телодвижений", что привело бы к некоторой потере в производительности. Кроме того, искать спагетти-код в программе из 37 строчек немного некорректно .
artes33 вне форума   Ответить с цитированием
Старый 26.07.2010, 05:11   #9 (permalink)
artes33
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;
}
artes33 вне форума   Ответить с цитированием
Старый 26.07.2010, 05:12   #10 (permalink)
Long Cat
Banned
 
Регистрация: 01.09.2009
Сообщений: 4,396
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Репутация: 2544
По умолчанию

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

Яндекс

Member
 
Регистрация: 31.10.2006
Сообщений: 40200
Записей в дневнике: 0
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Репутация: 55070
Ответ

Опции темы
Опции просмотра

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Выкл.
HTML код Выкл.
Trackbacks are Вкл.
Pingbacks are Вкл.
Refbacks are Выкл.




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

Powered by vBulletin® Version 6.2.5.
Copyright ©2000 - 2014, Jelsoft Enterprises Ltd.