Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2004.01.29;
Скачать: CL | DM;

Вниз

Алгоритм перевода из УНАРНОЙ в ДВОИЧНУЮ систему?   Найти похожие ветки 

 
Rradion   (2004-01-15 18:51) [0]

Если у кого есть, скиньте плиз алгоритм перевода чисел из унарной системы счислений ( пример ||| = 3 ) в двоичную ( 0011 = 3 ). В смысле не в делфи, а на словах.

Заранее Спасибо!


 
Digitman ©   (2004-01-15 18:56) [1]

чтой-то вдруг 0011-репрезентация стала унарной ? всю жизнь двоичной была


 
Digitman ©   (2004-01-15 18:57) [2]


> В смысле не в делфи, а на словах.


замечательное определение)


 
Юрий Зотов ©   (2004-01-15 19:12) [3]

То есть - как сосчитать количество палочек в строке, состоящей из этих самых палочек? Это имеется в виду?


 
Agent13 ©   (2004-01-15 19:14) [4]

А что, серьёзно - набор палочек разывается унарной системой счисления? Во блин, названий напридумывали!


 
Rradion   (2004-01-15 19:52) [5]

>>А что, серьёзно - набор палочек разывается унарной системой счисления? Во блин, названий напридумывали!

Ну да, унарная система это палочки ( или единицы ) - Т.е. три палочки "|||" или три единицы "111" в унарной системе это "3" в десятеричной.

А система где есть "0" и "1" это двоичная или бинарная. В ней, могу ошибиться, десятеричная "3" или унарная "111" это "0011".

Мне задали написать прогу для ( вынимание ! ) Машины Тюринга. Ну, точнее, ее виртуального эмитатора. Которая бы переводила эти палочки ( число в унарной системе ) в нолики и единицы ( в двоичную систему ).

К примеру "|||=0011"

Соответственно надо алгоритм, опять же на словах :) , как образуются эти нули и единицы в двоичной системе.

Хотя бы табличку, типа

( в десятеричной / в двоичной )

1 = 0001
2 = ...
3 = 0011
4 = ...
5 = ...
и т.д.

Ой, надеюсь понятно написал :)

Спасибо!


 
Agent13 ©   (2004-01-15 19:55) [6]

Неужели двоичной системы не знаешь? Всё легко:
1=1
2=10
3=11
4=100
5=101
... Уловил?


 
Dimman1 ©   (2004-01-15 20:02) [7]

аа, машина Тьюринга, это где головка по ленте ползает туда-обратно :)))


 
DrPass ©   (2004-01-15 20:03) [8]

А слабо в унарной системе представить 2 в 64-й степени?


 
Andy BitOff ©   (2004-01-15 20:05) [9]

Я чего-то не допонял. Десять палочек это 10 десятичное?


 
Rradion   (2004-01-15 20:06) [10]

>>... Уловил?

Неа... а 6,7,8,9 как?

А и там, броди, все с четермя знаками было... типа если 1=0001 а 3=0011, то 13 = 00010011 ?

А то, если 1=1 и 2=10, то 21 = 101 ... и как перерь понять, это 21 или 5? Или это я уже совсем позапутался?

Спасибо!


 
Юрий Зотов ©   (2004-01-15 20:12) [11]

> Rradion

Вот ответ на Ваш вопрос ТОЧНО так, как он поставлен: длина строки.


 
Agent13 ©   (2004-01-15 20:13) [12]

Да нет, вот смотри: в десятичной системе десять цифр 0..9, после 9 идёт 10. В двоичной только две: 0 и 1. После 1 больше цифр нет и идёт 10. После 11 идёт 100 (как в десятичной после 99) и т.д. А то что спереди нули, например 0011, так их можно писать сколько угодно, ведь 0058 и 58 это то же самое, направда ли?


 
Andy BitOff ©   (2004-01-15 20:15) [13]

1=1
2=10
3=11
Вот это запомни, после ставь следующий разряд.
4=100
и повторяй
5=101
6=110
7=111
Ставь след. разряд и повторяй
8=1000
9=1001
10=1010
11=1011
12=1100
13=1101
и т.д.


 
Dimman1 ©   (2004-01-15 20:16) [14]

А я в свое время писал прогу (на дельфи конечно) тоже эмулирующую машину тьюринга, задание было таким:

Даны два массива по 6 пятиразрядных двоичных чисел со знаком (в двоичной системе).
Получить массив M3=M2-M1 - из элементов второго массива вычесть соответствующие элементы первого массива. Найти сумму элементов массива M3 и представить ее в восьмеричной системе счисления.

Если надо, пиши, замылю.


 
Andy BitOff ©   (2004-01-15 20:32) [15]

//А и там, броди, все с четермя знаками было... типа если 1=0001 а 3=0011, то 13 = 00010011 ?

Дополни каждое нулями слева и все.


 
Германн ©   (2004-01-16 01:09) [16]

А может автору нужен перевод в двоично-десятичную систему? Тогда точно - 13 = 00010011 .


 
ALEIIIKA ©   (2004-01-16 06:54) [17]

Грамотеи [10],[16] число 13 в двоичной системе - 1101 :(
Перевод из одной системы счисления в другую осуществляеться таким образом:
13 (10-ная) -> необходимо в 2-ную:

13 / 2 = 6 (1)
6 / 2 = 3 (0)
3 / 2 = 1 (1)
1 = (1)
Искомое число (снизу вверх): 1101

Теперь объясняю (этот алгоритм для любого перевода из одной системы счисления в другую):
1. Число 13 делишь на 2 (искомая система двоичная поэтому 2)
2. Остаток запоминаешь, а частное делишь еще раз.
3. Опять запоминаешь остаток, а частное делишь.
4. Повторяешь до тех пор пока частное не станет меньше искомой системы счисления.
5. Затем в обратном порядке записываешь:
- последнее частное;
- предпоследний остаток;
...
- первый остаток.

Ля ву пле!


 
Dimman1 ©   (2004-01-16 08:20) [18]

ALEIIIKA, в [16] как раз все правильно написано, 13 = 00010011 в двоично-десятичной. А ты вообще тему ветки читал?


 
Alexander666 ©   (2004-01-16 09:09) [19]

Гмм, а нельзя ли унарные палочки в десятеричную, а потом в двоичную системы? Или прям сразу надо?


 
Alexander666 ©   (2004-01-16 09:16) [20]

А, впрочем, зная количество палочек... тогда правда, нужно из десятичной в двоичную переводить.


 
Fay ©   (2004-01-16 09:38) [21]

Бред какой-то...


 
Юрий Зотов ©   (2004-01-16 12:39) [22]

> Продолжающим мучительно искать решение

ЧИСЛА не бывают НИ В КАКОЙ системе счисления. В системе счисления бывают только СТРОКИ, представляющие эти числа.

Поэтому ТОЧНЫЙ ответ на вопрос дан в [11]. К нему лишь можно добавить, что если УЖЕ полученное значение (то есть, количество палочек) ДАЛЕЕ требуется преобразовать в СТРОКУ (например, чтобы показать ее человеку), то нужно написать (или взять готовую) функцию (аналог IntToHex). Но это уже совершенно ДРУГАЯ задача, не имеющая к сабжу абсолютно никакого отношения.


 
nikkie ©   (2004-01-16 16:17) [23]

я так понял, что автор смутное представление имеет о двоичной системе. а ему задали программу для машину тьюринга написать. сочуйствую...


 
AKul ©   (2004-01-16 16:47) [24]

Согласен с:

> Юрий Зотов © (16.01.04 12:39) [22]
>
> ЧИСЛА не бывают НИ В КАКОЙ системе счисления. В системе
> счисления бывают только СТРОКИ, представляющие эти числа.

Но насколько я понял, автору надо реализовать алгоритм на машине Тьюринга, т.е. что-то типа такого:
На входе у него СТРОКА (из 1), и на выходе надо получить СТРОКУ (из 0 и 1). Преобразовывать СТРОКА -> значение (ячейка памяти) здесь нельзя.
Алгоритм будет приблизительно такой:
Сначала надо организовать алгоритм увеличения числа (опять же представленного в виде СТРОКИ в двоичной системе счисления) на единицу, т.е.:
начальное значени "00000000"
при следующем вызове "00000001"
при следующем "00000010"
при следующем "00000011"
и т.д.
Более подробно я не описываю, думаю автор сможет сложить 0+1 или выполнить перенос при 1+1.
Теперь:
1. Начальное значение:
111111________________00000000
^ - головка здесь
2. Если под головкой 1, то записать пробел и идти на алгоритм увеличения выходного значения на 1.
11111_________________00000001
^ - головка здесь

3. Двигаться влево пока под головкой не пробел.
11111_________________00000001
^ - головка здесь
4. Двигаться влево пока под головкой пробел или не достигли крайнего левого положения, если достигли - СТОП.
11111_________________00000001
^ - головка здесь

4. Повторяем с пункта 2:
1111__________________00000010
111___________________00000011
11____________________00000100
1_____________________00000101
______________________00000101

P.S. Если что забыл, то извиняюсь...


 
AKul ©   (2004-01-16 16:53) [25]

Sorry, При передаче сообщения головка (машины Тьюринга) во всех строках съехала влево за счет символов не одинаковой ширины (пробел очень узкий) - пусть автор скопирует в текстовый редактор и отформатирует текст с шрифтом с постоянной шириной символов (Courier).


 
Тьюринг   (2004-01-16 19:22) [26]

Вы мою машину не трогайте, и так еле работает... программисты...


 
Rradion   (2004-01-17 13:59) [27]

УРА! Сделал, работает ( см. картинку ) ! Огромное всем Шпасба!

Если кому надо, закачаю и програмку и саму машину!

http://www.elena-antimonova.com/BRT/mtu1r.gif

Удачи!


 
Cosinus ©   (2004-01-17 14:17) [28]

Надо.
cosinus@bk.ru


 
Rradion   (2004-01-17 14:27) [29]

Ок, сам эмитатор Алго2000
http://www.elena-antimonova.com/BRT/Algo2000.rar

И данная прога
http://www.elena-antimonova.com/BRT/kursovaya.tur

Удачи!


 
Наиль   (2004-01-17 23:39) [30]

это функция на visual basic, если сооброзишь переделай её на delphi. она переводит десятичное число в двоичное.

вызов функции:
Private Sub Command2_Click()
Dim st As String
Dim t As Integer
st = Text3.Text
t = Int(st)
st = Str(mama(t))

Text4.Text = st
End Sub
---------------------------------------
Function mama(mam1 As Variant) As Long

Dim x, sex As Integer
Dim y As Variant
Dim sum, sumx, matrix As String
x = mam1

Do
sex = x
x = x \ 2
y = sex Mod 2
sum = sum + Str(y)
Loop Until x < 2
If x < 2 Then
sumx = sum + Str(x)

For i = Len(sumx) To 1 Step -1 "len()-длина строки

matrix = matrix + Mid(sumx, i, 1)
Next i

mama = Val(matrix)
End If
End Function
На счёт палочек!!! Лучше в одной процедуре напиши эту функцию и цикл for. Например:
если ввели пять т. е. ||||| то
sum:=0;
for i:=1 to length(edit1.text) do
sum:=sum+1;
Далее переменную sum со значением пять присвой переменной t
и вызови функцию.


 
Наиль   (2004-01-17 23:51) [31]

это функция на visual basic, если сооброзишь переделай её на delphi. она переводит десятичное число в двоичное.

вызов функции:
Private Sub Command2_Click()
Dim st As String
Dim t As Integer
st = Text3.Text
t = Int(st)
st = Str(mama(t))

Text4.Text = st
End Sub
---------------------------------------
Function mama(mam1 As Variant) As Long

Dim x, sex As Integer
Dim y As Variant
Dim sum, sumx, matrix As String
x = mam1

Do
sex = x
x = x \ 2
y = sex Mod 2
sum = sum + Str(y)
Loop Until x < 2
If x < 2 Then
sumx = sum + Str(x)

For i = Len(sumx) To 1 Step -1 "len()-длина строки

matrix = matrix + Mid(sumx, i, 1)
Next i

mama = Val(matrix)
End If
End Function
На счёт палочек!!! Лучше в одной процедуре напиши эту функцию и цикл for. Например:
если ввели пять т. е. ||||| то
sum:=0;
for i:=1 to length(edit1.text) do
sum:=sum+1;
Далее переменную sum со значением пять присвой переменной t
и вызови функцию.



Страницы: 1 вся ветка

Текущий архив: 2004.01.29;
Скачать: CL | DM;

Наверх




Память: 0.55 MB
Время: 0.017 c
1-93487
Луарвик
2004-01-15 13:35
2004.01.29
Копирование файла из буфера обмена на диск


1-93537
Cardinal
2004-01-17 10:25
2004.01.29
Как закрыть консоль при отсутствии ошибок?


1-93538
Godness
2004-01-15 20:38
2004.01.29
ХР стиль


6-93607
DelphiN!
2003-11-24 21:53
2004.01.29
Как убрать сообщения об ошибках от TServerSocket и TClientSocket


1-93515
Looo
2004-01-18 20:00
2004.01.29
Повторяющиеся действия