Форум программистов, компьютерный форум, киберфорум
Наши страницы

Turbo Pascal

Войти
Регистрация
Восстановить пароль
 
Рейтинг: Рейтинг темы: голосов - 8, средняя оценка - 4.88
XChr
0 / 0 / 0
Регистрация: 13.11.2013
Сообщений: 84
Завершенные тесты: 1
#1

Перевод факториала в двоичную систему - Turbo Pascal

22.12.2013, 19:35. Просмотров 1343. Ответов 8
Метки нет (Все метки)

Привет всем.
Нужна программа, которая переводит факториал в двоичную систему.
Желательно. чтобы при переводе каждая цифра (1 и 0 соответственно)
находилась в отдельной ячейки массива.

Pascal
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
Var a,a2:array[1..100000000] of int64;
 i,j,b,t,n,c:longint;
 x:int64;
 
 begin
 clrscr;
 Read(n);
 a[1]:=1;
 t:=1;
 b:=1;
 for i:=1 to n do
 begin
 x:=0;
 for j:=1 to t do
 begin
 x:=x+a[j]*b;
 a[j]:=x mod 10;
 x:=x div 10;
 end;
 while x>0 do
 begin
 inc(t);
 a[t]:=x mod 10;
 x:=x div 10;
 end;
 inc(b);
 end;
 Write(a[t]);
 for i:=t-1 downto 1 do
 begin
 Write(a[i]);
 end;
 end.
Добавлено через 21 минуту
Переформулирую задачу.
Вводится факториал какого-то числа.
И мне нужно получить факториал этого числа в двоичной системе счисления, причём, чтобы каждая цифра (1 или 2 соответственно) была в отдельной ячейке массива.
Например, ввожу 8 и получаю 1001110110000000

Добавлено через 1 час 1 минуту
Вводимое число в диапазоне от 1 до 10000
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
22.12.2013, 19:35
Я подобрал для вас темы с готовыми решениями и ответами на вопрос Перевод факториала в двоичную систему (Turbo Pascal):

Перевод чисел в двоичную систему - Turbo Pascal
В одной из многочисленных пещер Миртаны Безамянный встретил мага огня по имени Аркон. Аркон обладает древним артефактом, однако отдать его...

Перевод чисел в двоичную систему числения - Turbo Pascal
Создать файл целых чисел при вводе чисел с клавиатуры. Создать новый файл который бы содержал целые числа первого файла в двоичной системе!

Перевод длинных чисел в двоичную систему - Turbo Pascal
Записывать в двоичной системе счисления целое число, имеющее не более100 цифр в десятичной записи

Перевод числа в двоичную систему счисления - Turbo Pascal
Подскажите пжл. Program U; Uses Crt; Var d,j:Byte; Function DS(z:Byte):Byte; Var i:Byte; a:array Of Byte; begin ...

Перевод дробного числа в двоичную систему - Turbo Pascal
Всем привет, вообщем нужно мне перевести дробное число в двоичную систему, с обычным числом проблем то нет а вот с дробным никак не...

Перевод IP-адреса в двоичную систему счисления - Turbo Pascal
Ребят,у меня проблема.Вот задача:Известно, что IP-адрес записывается в нескольких вариантах. Наиболее известен «человеческий» вариант....

8
Напильнег
481 / 119 / 10
Регистрация: 30.09.2010
Сообщений: 473
22.12.2013, 22:48 #2
Цитата Сообщение от XChr Посмотреть сообщение
Переформулирую задачу.
Не надо умничать - исходная задача (найти количество хвостовых нулей в двоичном представлении факториала) имела эффективное решение, а переформулированная художественная самодеятельность - нет.
0
XChr
0 / 0 / 0
Регистрация: 13.11.2013
Сообщений: 84
Завершенные тесты: 1
23.12.2013, 11:56  [ТС] #3
Цитата Сообщение от Напильнег Посмотреть сообщение
Не надо умничать - исходная задача (найти количество хвостовых нулей в двоичном представлении факториала) имела эффективное решение, а переформулированная художественная самодеятельность - нет.
Выражение "хвостовые нули" означает, что есть какая-то зависимость?
0
Напильнег
481 / 119 / 10
Регистрация: 30.09.2010
Сообщений: 473
23.12.2013, 23:41 #4
Есть: количество хвостовых нулей в двоичном представлении числа равно тому, сколько раз это число делится на 2 нацело. А для того, чтобы определить, сколько раз можно разделить факториал на 2, его вовсе не нужно считать. Если подумать
2
XChr
0 / 0 / 0
Регистрация: 13.11.2013
Сообщений: 84
Завершенные тесты: 1
28.12.2013, 10:22  [ТС] #5
Цитата Сообщение от Напильнег Посмотреть сообщение
Если подумать
Я думаю, это связанно с двойкой и степенью, которая будет включать в себя факториал этого числа (степень - количество хвостовых нулей). Но как это реализовать, мне не совсем понятно) Я прав?

Добавлено через 6 минут
Хотя, судя по ручной проверке, я не прав.

Добавлено через 35 минут
Короче, я сверху какую-то ахинею написал, по-моему.) На самом деле, нужно разложить факториал на простые множители и чётный числа разложить на произведение цифры 2. То есть,
6!= 1*2*3*4*5*6 = 1*2*3*2*2*5*2*2*2.
Однако будут показываться на хвостовые нули, а сколько нулей всего в числе при переводе в двоичную.

Добавлено через 12 часов 19 минут
Цитата Сообщение от XChr Посмотреть сообщение
Я думаю, это связанно с двойкой и степенью, которая будет включать в себя факториал этого числа (степень - количество хвостовых нулей). Но как это реализовать, мне не совсем понятно) Я прав?

Добавлено через 6 минут
Хотя, судя по ручной проверке, я не прав.

Добавлено через 35 минут
Короче, я сверху какую-то ахинею написал, по-моему.) На самом деле, нужно разложить факториал на простые множители и чётный числа разложить на произведение цифры 2. То есть,
6!= 1*2*3*4*5*6 = 1*2*3*2*2*5*2*2*2.
Однако будут показываться на хвостовые нули, а сколько нулей всего в числе при переводе в двоичную.
В расчёт ошибку сделал и понять не мог, где же неправильно
Итак, для того, что бы понять сколько же нулей у нас будет в двоичной системе:
6!=1*2*3*2*2*5*2*3 Итого 4 нуля.

Теперь код программы, которая работает, но не корректно. Не хочет делить повторно, но не могу понять почему.

Pascal
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
uses crt;
var a,b,c,i,count2:integer;
 
function wow(k:integer):integer;
var count: integer;
begin
count:=0;
While (k mod 2)=0 do begin
k:=k div 2;
inc(count);
count2:=count;
end;
end;
 
begin
clrscr;
Readln (a);
For i:=1 to a do begin
if (i mod 2) = 0 then
wow(i);
end;
WriteLn (count2);
readln (a);
end.

Так, нашёл ошибку. Она заключается в count:=0;, но теперь я не знаю, как мне сделать, чтобы счётчик не аннулировался...

Добавлено через 2 часа 29 минут
Всё, доделал.
0
Напильнег
481 / 119 / 10
Регистрация: 30.09.2010
Сообщений: 473
28.12.2013, 23:59 #6
Цитата Сообщение от XChr Посмотреть сообщение
Всё, доделал.
А теперь, внимание, правильный ответ!

Факториал состоит из произведения чередующихся четных и нечетных чисел. Произведения нечетных чисел дают нечетные числа, так что их отбрасываем. Каждое четное число можно поделить на 2 хотя бы один раз, и будет четных чисел в факториале N div 2. Т.о. сразу имеем N div 2 хвостовых нулей в двоичном представлении. Теперь поделим каждое четное число на 2 один раз, половина из них станет нечетными, половина останется четными, что даст еще (N div 2) div 2 возможностей поделить на 2 и, соответственно, еще (N div 2) div 2 хвостовых нулей. И так далее. Тут проще программу написать, чем что-то еще пояснять.

В твоих обозначениях:
Pascal
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
begin
 ...
 
 Readln(a);
 
 count2:=0;
 while (a>1) do begin
   a:=a div 2;
   inc(count2,a);
   end;
 
 WriteLn(count2);
 
 ...
end.
1
XChr
0 / 0 / 0
Регистрация: 13.11.2013
Сообщений: 84
Завершенные тесты: 1
30.12.2013, 15:14  [ТС] #7
Моя программа и работает по такому алгоритму . Ну у вас код изысканнее получился конечно
0
Напильнег
481 / 119 / 10
Регистрация: 30.09.2010
Сообщений: 473
30.12.2013, 21:49 #8
Нет. Твоя программа считает, сколько раз делится на 2 каждый четный множитель, а у меня на каждом шаге просто подсчитывается количество четных чисел, и при заданных ограничениях результат достигается максимум за 13 итераций, а у тебя большее количество действий получается уже для 16! (это даже если довести до ума).
0
XChr
0 / 0 / 0
Регистрация: 13.11.2013
Сообщений: 84
Завершенные тесты: 1
31.12.2013, 06:18  [ТС] #9
Цитата Сообщение от Напильнег Посмотреть сообщение
Нет. Твоя программа считает, сколько раз делится на 2 каждый четный множитель, а у меня на каждом шаге просто подсчитывается количество четных чисел, и при заданных ограничениях результат достигается максимум за 13 итераций, а у тебя большее количество действий получается уже для 16! (это даже если довести до ума).
То есть, она работает корректно, но просто в ней много лишних операций, которые будут жрать память?
0
31.12.2013, 06:18
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
31.12.2013, 06:18
Привет! Вот еще темы с ответами:

Перевод из десятичной в двоичную систему счисления с помощью рекурсии - Turbo Pascal
Перевод из десятичной в двоичную систему счисления с помо-щью рекурсии.

Рекурсивный алгоритм перевод числа в двоичную систему счисления - Turbo Pascal
Написать рекурсивный алгоритм перевода числа в двоичную систему счисления. Т.е. вводим с клавиатуры любое число, и нужно написать...

Перевод десятичного числа в двоичную систему и вывод на экран - Turbo Pascal
может кому пригодится этот перевод и вывод var n,x,y:integer; begin clrscr; writeln('введите десят.число'); ...

Процедуры. Выполнить перевод десятичных чисел в двоичную систему счисления - Turbo Pascal
СПАСИТЕ!!! Выполнить программу, использующую подпрограмму - процедуру. Выполнить перевод десятичных чисел 10, 12, 15 в двоичную...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
9
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2018, vBulletin Solutions, Inc.
Рейтинг@Mail.ru