• Добро пожаловать на компьютерный форум Tehnari.ru. Здесь разбираемся с проблемами ПК и ноутбуков: Windows, драйверы, «железо», сборка и апгрейд, софт и безопасность. Форум работает много лет, сейчас он переехал на новый движок, но старые темы и аккаунты мы постарались сохранить максимально аккуратно.

    Форум не связан с магазинами и сервисами – мы ничего не продаём и не даём «рекламу под видом совета». Отвечают обычные участники и модераторы, которые следят за порядком и качеством подсказок.

    Если вы у нас впервые, загляните на страницу о проекте и правила – там коротко описано, как задать вопрос так, чтобы быстро получить ответ. Чтобы создавать темы и писать сообщения, сначала зарегистрируйтесь, а затем войдите под своим логином.

    Не знаете, с чего начать? Создайте тему с описанием проблемы – подскажем и при необходимости перенесём её в подходящий раздел.
    Задать вопрос Новые сообщения Как правильно спросить
    Если пришли по старой ссылке со старого Tehnari.ru – вы на нужном месте, просто продолжайте обсуждение.

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

Fishbone

Ученик
Регистрация
11 Июл 2010
Сообщения
1
Реакции
0
Баллы
0
Помогите с факториалами в С++

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

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

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

словами
x3 - x в степени 3
x5 - в степени 5
xn - в степени n)
 
Странно, что никто не ответил, задача элементарная:

#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;
}
 
Пожалуйста, оформляйте текст программы отступами!
Используйте тег форума CODE.
Указывайте компилятор, не все компиляторы понимают тип __int64.
 
Сорри, список бб тегов не посмотрел:

Код:
#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;
}
 
Использование меток и безусловных переходов в программах крайне нежелательно.
 
Есть такое мнение. Но Дональд Кнут писал, что поколения программистов были испорчены запретом на оператор безусловного перехода.
 
А Эдсгер Вайба Дейкстра писал, что квалификация программиста обратно пропорциональна числу использованных меток.
 
Я не думаю, что обсуждения этого вопроса стоит вести в этом треде. Без этого оператора пришлось совершать бы больше лишних "телодвижений", что привело бы к некоторой потере в производительности. Кроме того, искать спагетти-код в программе из 37 строчек немного некорректно ;).
 
Можно и без него, конечно:
Код:
#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;
}
 
Данный раздел предполагает помощь начинающим программистом.
Преследуется цель демонстрации в первую очередь понятного, а уже во вторую - быстрого кода.
Ну и по поводу убыстрения - вызов fact происходит гораздо чаще, а там можно заменить
if ((n == 1) || (n == 0))
на
if (n < 2)
 
Конечно, правильно, но врожденная вредность требует возразить:

Данный раздел предполагает помощь начинающим программистом.

и
Код:
if ((n == 1) || (n == 0))
более наглядно отражает алгебраическое определение факториала от нуля: 0! = 1.

з.ы. Просто поспорить люблю.

з.ы.ы. Тогда stable release:
Код:
#include <iostream>
#include <cmath>

unsigned __int64 fact(unsigned __int64 n)
{
	if (n < 2)
	{
		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;
}
 
Последнее редактирование:
По поводу стилистики, я к сожалению, могу еще долго цепляться...
У нас катастрофическая нехватка программистов на форуме, поэтому в эту тему долго не было ответа.
 
помогите пожалуста решить задачу

вывести 1-x2/2!+x4/4!-...+(-1)n*x2n/(2n)!
где х2,х4,х2n- степени числа х,
(-1)n - степень числа (-1)
 
Назад
Сверху