Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > IT форум > Помощь студентам
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 04.10.2011, 15:43   #1
Wild_klas
Форумчанин
 
Аватар для Wild_klas
 
Регистрация: 13.10.2010
Сообщений: 109
Вопрос Факториал четных чисел С ++.

Здравствуйте, не давно начал изучать С ++, и вот моя первая запара:
Нужно подсчитать суму факториалов четных чисел от N1 do N2.
Вот мой код, работает не правильно, подскажите что не так.
Заранее спасибо.
Код:
#include "stdafx.h"
#include <iostream>
#include <math.h>
using namespace std;

int fact(int n, int m)
{
    for (int i = n; i > m; ++i)
		if (n % 2 == 0){
        n *= i;
		}
 
    return n;
}

int _tmain(int argc, _TCHAR* argv[])
{
	int N1, N2, i;
	float s;
	cout << "Vvedit` N1 = ";
	cin >> N1;
	cout << "Vvedit` N2 = ";
	cin >> N2;
	
	for (i = N1, s = 0; i <= N2; ++i ) ;
	{
	  s += fact (N1, N2);
	}
	cout << s;
	system("pause");
	return 0;
}
Учусь учиться.
Wild_klas вне форума Ответить с цитированием
Старый 04.10.2011, 20:13   #2
val_nnm
Форумчанин
 
Регистрация: 18.10.2009
Сообщений: 185
По умолчанию

Если я правильно понял ваше задание то примерно вот так (код непроерял, т.к. компилятора нет под рукой да и С++ не мой основной язык программировани)

Код:
float fact(int n)
{
    float p = 1;
    for (int i = 2; i <= n; ++i)
        p *= i;
    return p;
}

int _tmain(int argc, _TCHAR* argv[])
{
	int N1, N2, i;
	float s;
	cout << "Vvedit` N1 = ";
	cin >> N1;
	cout << "Vvedit` N2 = ";
	cin >> N2;
	N1 += N1%2; // Находим большее чётное
	for (i = N1, s = 0; i <= N2; i+=2 )
	{
	  s += fact(i);
	}
	cout << s;
	system("pause");
	return 0;
}

или тожесамое но немного более оптимизированное по скорости выполнения

Код:
float fact(int n)
{
    float p = 1;
    for (int i = 2; i <= n; ++i)
        p *= i;
    return p;
}

int _tmain(int argc, _TCHAR* argv[])
{
	int N1, N2, i;
	float s;
	cout << "Vvedit` N1 = ";
	cin >> N1;
	cout << "Vvedit` N2 = ";
	cin >> N2;
	N1 += N1%2; // Находим большее чётное

           float p = fact(N1);
	for (i = N1, s = 0; i <= N2; i+=2 )
	{
	  s += p;
             p *= i+1;
             p *= i+2;
	}
	cout << s;
	system("pause");
	return 0;
}
На С# пишу лучше чем на русском.
"У меня правильнописание хромает. Оно хорошее, но почему-то хромает."

Последний раз редактировалось val_nnm; 04.10.2011 в 20:15.
val_nnm вне форума Ответить с цитированием
Старый 04.10.2011, 20:37   #3
Wild_klas
Форумчанин
 
Аватар для Wild_klas
 
Регистрация: 13.10.2010
Сообщений: 109
По умолчанию

val_nnm, не большее чётное а суму четных чисел от N1 до N2.
Учусь учиться.
Wild_klas вне форума Ответить с цитированием
Старый 04.10.2011, 20:45   #4
val_nnm
Форумчанин
 
Регистрация: 18.10.2009
Сообщений: 185
По умолчанию

я понял что нужно найти сумму факториалов от чётных чисел лежащий в диапазоне от n1 до n2?

т.е. если скажем задать n1 = 3 а n2=9 то нужно найти s = 4!+6!+8!=(1*2*3*4)+(1*2*3*4*5*6)+(1 *2*3*4*5*6*7*8)
если задать n1=4 а n2 = 8 то результат будет тотже s = 4!+6!+8!=(1*2*3*4)+(1*2*3*4*5*6)+(1 *2*3*4*5*6*7*8)


я правельно понял задание?


а фраза "Находим большее чётное" означает что ма находим первое чётное с которого начинаем вычислять фактриалы.
т.е. если n1=3 то 3%2 = 1 т.е. мы изменяем начальное значение на 4=3+1
а если n=4 то 4%2 = 0 т.е. начальное значение остаёться неизменным.
На С# пишу лучше чем на русском.
"У меня правильнописание хромает. Оно хорошее, но почему-то хромает."

Последний раз редактировалось val_nnm; 04.10.2011 в 20:49.
val_nnm вне форума Ответить с цитированием
Старый 04.10.2011, 22:18   #5
Wild_klas
Форумчанин
 
Аватар для Wild_klas
 
Регистрация: 13.10.2010
Сообщений: 109
По умолчанию

val_nnm, спасибо огромное. Тогда в код не глянул толком, с телефона был, сейчас разобрался, все работает. Выручил.
Учусь учиться.

Последний раз редактировалось Wild_klas; 04.10.2011 в 22:21.
Wild_klas вне форума Ответить с цитированием
Старый 05.10.2011, 00:27   #6
Wild_klas
Форумчанин
 
Аватар для Wild_klas
 
Регистрация: 13.10.2010
Сообщений: 109
По умолчанию

только есть один вопрос:
что делает эта строчка? не могу понять.
Код:
 p *= i+1;
             p *= i+2;
Учусь учиться.
Wild_klas вне форума Ответить с цитированием
Старый 05.10.2011, 00:35   #7
val_nnm
Форумчанин
 
Регистрация: 18.10.2009
Сообщений: 185
По умолчанию

если посмотреть на ряд. Например на (1*2*3*4)+(1*2*3*4*5*6)+(1*2*3*4*5* 6*7*8)+(1*2*3*4*5*6*7*8*9*10)


то каждый факториал очень похож на предыдущий.

4! = (1*2*3*4)
6! = (1*2*3*4*5*6) = (1*2*3*4)*(5*6) = 4!*(4+1)*(4+2)


8! = (1*2*3*4*5*6*7*8) = (1*2*3*4*5*6)*(7*8)=6!*(6+1)*(6+2)

10! = (1*2*3*4*5*6*7*8*9*10) = (1*2*3*4*5*6*7*8)*(9*10)= 8!*(8+1)*(8+2)
и.т.д.

т.е. мы просто берём результат полученный для предыдущего факториала и получаем следующий
мы заранее расчитываем значение факториала на следующий шаг из тех данных что у нас уже есть.


p.s. коментарий
Код:
N1 += N1%2; // Находим большее чётное
правильнее написать
Код:
N1 += N1%2; // Находим большее или равное ближайшее чётное
На С# пишу лучше чем на русском.
"У меня правильнописание хромает. Оно хорошее, но почему-то хромает."

Последний раз редактировалось val_nnm; 05.10.2011 в 00:38.
val_nnm вне форума Ответить с цитированием
Старый 05.10.2011, 00:48   #8
Wild_klas
Форумчанин
 
Аватар для Wild_klas
 
Регистрация: 13.10.2010
Сообщений: 109
По умолчанию

Я понял, спасибо.
Учусь учиться.
Wild_klas вне форума Ответить с цитированием
Старый 05.10.2011, 01:07   #9
Wild_klas
Форумчанин
 
Аватар для Wild_klas
 
Регистрация: 13.10.2010
Сообщений: 109
По умолчанию

Цитата:
Сообщение от val_nnm Посмотреть сообщение
p.s. коментарий
Код:
N1 += N1%2; // Находим большее чётное
правильнее написать
Код:
N1 += N1%2; // Находим большее или равное ближайшее чётное
Это ясно)
Учусь учиться.
Wild_klas вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Создать файл целых чисел с данным именем и записать в него N первых положительных четных чисел prelest' Паскаль, Turbo Pascal, PascalABC.NET 4 01.06.2011 10:27
ввод четных чисел с 40 ячейки Enessis Assembler - Ассемблер (FASM, MASM, WASM, NASM, GoASM, Gas, RosAsm, HLA) и не рекомендуем TASM 5 05.09.2010 07:54
Распознавание четных чисел Demigoddess Общие вопросы C/C++ 3 11.03.2009 21:43
нахождение суммы четных чисел в массиве Ci_novice Общие вопросы C/C++ 1 23.12.2007 12:11