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

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

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

Восстановить пароль

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

Ответ
 
Опции темы Поиск в этой теме
Старый 19.04.2012, 21:40   #1
maksat-15
 
Регистрация: 29.12.2011
Сообщений: 8
По умолчанию Вычисления факториала больших чисел (с++)

Нужно написать функцию для вычисления факториала до 100. а результаты записать в виде много байтового числа. Подкиньте идею.или можете даже код)))
maksat-15 вне форума Ответить с цитированием
Старый 19.04.2012, 22:06   #2
Asdprom
Форумчанин
 
Регистрация: 05.02.2011
Сообщений: 119
По умолчанию

Идея Тут.
Много байтового числа это long или int.
Код:
#include "stdafx.h"
#include <iostream>
//#include


int _tmain(int argc, _TCHAR* argv[])
{
	int i;
	int fact =1;
	for(i=1;i<101;i++){ fact *= i;}
	std::cout<<fact;

	system("pause");
	return 0;
}
Если я не ошибаюсь. Факториал - это произведение всех чисел заданного диапазона.
Если что - то не так - извиняйте.
Asdprom вне форума Ответить с цитированием
Старый 19.04.2012, 22:19   #3
BDA
МегаМодератор
СуперМодератор
 
Аватар для BDA
 
Регистрация: 09.11.2010
Сообщений: 7,430
По умолчанию

Asdprom, проблема в том, что 100!=933262154439441526816992388562 66700490715968264381621468592963895 21759999322991560894146397615651828 62536979208272237582511852109168640 00000000000000000000000 (по заявлению Wolfram Alpha).
Пишите язык программирования - это форум программистов, а не экстрасенсов. (<= это подпись )
BDA вне форума Ответить с цитированием
Старый 19.04.2012, 22:49   #4
Rin
Негодник
Форумчанин
 
Аватар для Rin
 
Регистрация: 10.11.2009
Сообщений: 880
По умолчанию

BDA дело говорит. Прикольнула задача, написал на delphi, правда при 100! выдаёт первые 14 цифр правильно, а 15 округляет. То есть
Цитата:
933262154439441526816992388562 66700490715968264381621468592963895 21759999322991560894146397615651828 62536979208272237582511852109168640 00000000000000000000000
выдает 933262154439442(0). (0)-это значит, что все остальные разряды заполняются нулями.
Кстати, что значит в виде много байтового числа?
Код:
 function f(n:byte):extended;
    var i:byte;
    begin
      result:=1;
      for I := n downto 2 do
      result:=result*i;
    end;
    function stepen(n:byte):integer;
    var i:integer;
    begin
      result:=1;
      for I := 1 to n do result:=result*10;
    end;
var s,chislo:string;
 e,tochka,count_razryad:integer;
i:integer;
begin
  s:=floattostr(f(100));
  if pos('E',s)<>0 then
  begin
     tochka:=pos(',',s);
     e:=pos('E',s);
     count_razryad:=0;
     for I := e+1 to length(s) do
     count_razryad:=count_razryad+strtoint(s[i])*(stepen(length(s)-i));
     chislo:=copy(s,1,1)+copy(s,3,e-tochka-1);
     for I := 1 to count_razryad-(e-tochka-1) do
       chislo:=chislo+'0';
  end
  else chislo:=s;
  showmessage(chislo);
Если помог, проси поставить минус. Будь оригинален!

Последний раз редактировалось Rin; 19.04.2012 в 23:05.
Rin вне форума Ответить с цитированием
Старый 20.04.2012, 07:51   #5
s-andriano
Старожил
 
Аватар для s-andriano
 
Регистрация: 08.04.2012
Сообщений: 3,229
По умолчанию

Цитата:
Сообщение от Rin Посмотреть сообщение
BDA дело говорит. Прикольнула задача, написал на delphi, правда при 100! выдаёт первые 14 цифр правильно, а 15 округляет.
...
Кстати, что значит в виде много байтового числа?
Мельком глянул - при extended должно выдавать 18-19 верных цифр, а 14-15 - это должно быть double.

Многобайтовое число - подразумевается число, хранимое в памяти и обрабатываемое как массив.
Т.е. определяется новый тип и для него определяется операция умножения. Остальное - тривиально.
s-andriano вне форума Ответить с цитированием
Старый 08.06.2012, 21:59   #6
Asdprom
Форумчанин
 
Регистрация: 05.02.2011
Сообщений: 119
По умолчанию

Решается 2 - умя строчками кода в библиотеке GMP
Asdprom вне форума Ответить с цитированием
Старый 09.06.2012, 07:44   #7
s-andriano
Старожил
 
Аватар для s-andriano
 
Регистрация: 08.04.2012
Сообщений: 3,229
По умолчанию

Цитата:
Сообщение от Asdprom Посмотреть сообщение
Решается 2 - умя строчками кода в библиотеке GMP
Если в библиотеке есть функция факториала, то и одной строчки много.
Или в самой библиотеке факториал большого числа вычисляется двумя строчками?

PS. Когда речь идет об объеме кода при реализации некоторого алгоритма, ссылаться на библиотеку - дурной тон.
s-andriano вне форума Ответить с цитированием
Старый 09.06.2012, 08:39   #8
DiemonStar
Старожил
 
Регистрация: 08.02.2012
Сообщений: 2,173
По умолчанию

на ассемблере тут вообще проблем не вижу: массивчик байт на 100 (влом пересчитывать разряды в приведённом выше числе) для хранения результата и два цикла:
1) от 1 до 100
2) умножение содержимого массива побайтно с накоплением (а лучше сразу двойными словами).
1 умножаем байт на байт
2 младший байт на место, а старший запоминаем
3 умножаем следующий байт на байт
4 прибавляем старший байт из предыдущей операции
5 сохраняем младший байт и запоминаем старший
6 повторяем с п.3 пока число не закончится.
т.е. обычное умножение в столбик, только вместо десятиразрядных чисел можно использовать те, которые понимает процессор...

собственно, элементарная задача с использованием больших чисел)
Правильно поставленная задача - три четверти решения.

Последний раз редактировалось DiemonStar; 09.06.2012 в 09:07.
DiemonStar вне форума Ответить с цитированием
Ответ


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

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Автоматная программа вычисления факториала (Pascal) Iriska_7 Помощь студентам 1 27.02.2012 13:06
С++ Написать программу вычисления факториала vovanmiron Фриланс 12 07.11.2011 22:32
вычисления факториала в Delphi fleepone Помощь студентам 4 24.10.2011 09:08
В коде вычисления факториала, выдается ошибка Von C++ Builder 13 13.10.2010 11:47
Функция вычисления факториала (Паскаль)) Doublefaced Помощь студентам 12 01.10.2009 23:34