|
|
|
Хитро преобразовать строку в целое
|
|||
|---|---|---|---|
|
#18+
Доброго времени суток! Задача: имеется переменная (String, 6 символов, могут быть как цифры, так и буквы (латиница), пробелы и спецсимволы не допускаются). Необходимо разработать процедуру, которая будет формировать целое число (4 байта), однозначно соответствующее данной строке (если встречаются переменные одинаковые строковые переменные, им присваиваются одинаковые числа). Как это можно сделать? Заранее благодарен всем ответившим ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.06.2003, 13:19 |
|
||
|
Хитро преобразовать строку в целое
|
|||
|---|---|---|---|
|
#18+
Итого 26+10=36 символов. 0 - 0 ... 9 - 9 A - 10 ... Z - 35 S1*36**5 + S2*36**4 + S3*36**3 + S4*36**2 + S5*36**1 + S6 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.06.2003, 15:06 |
|
||
|
Хитро преобразовать строку в целое
|
|||
|---|---|---|---|
|
#18+
select CHECKSUM('строка') ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.06.2003, 18:06 |
|
||
|
Хитро преобразовать строку в целое
|
|||
|---|---|---|---|
|
#18+
Интересная задача! Думаю к понедельнику будет готово. Вот только возникло два вопрорса: 1. Откуда данная задача (здорово смахивает на олимпиадную). Или для чего такая задача поставлена. (Это просто из любопытства) 2. Точно ли она имеет решение? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 27.06.2003, 21:43 |
|
||
|
Хитро преобразовать строку в целое
|
|||
|---|---|---|---|
|
#18+
Fendom. И при чем тут проектирование БД? Если у Вас мозги не могут даже разобрать, в какой форум надо бросить вопрос, то никакие советы Вам уже не помогут. Подумайте. Гардеробщик - тоже хорошая профессия. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 28.06.2003, 00:25 |
|
||
|
Хитро преобразовать строку в целое
|
|||
|---|---|---|---|
|
#18+
Задача конечно не в тот форум. Мое мнение - данная задача не имеет решения. Представить строку из шести символов четырехзначным числом помоему невозможно, т.к. рассматриваются сочетания из более чем тридцати символов и к томуже в строке символы могут повторяться. Слишком много вариантов. Я так понимаю что надо ставить в соответствие каждому символу либо группе символов либо какойто последовательностии символов число. нО СЛИШКОМ МНОГО вариантов у меня не получилось. Если задача уже решена или есть какие то предложения - хотелось бы услышать. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 30.06.2003, 10:28 |
|
||
|
Хитро преобразовать строку в целое
|
|||
|---|---|---|---|
|
#18+
vinalik, не четырехзначным (что очевидно невозможно), а четырехбайтовым. Как это сделать я уже написал. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 30.06.2003, 12:07 |
|
||
|
Хитро преобразовать строку в целое
|
|||
|---|---|---|---|
|
#18+
Уважаемый Sti, А что дальше? Ведь один символ – всегда один байт!!! К примеру 62946198 - это 8 байт. Не сочтите за труд, разъясните мне. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 01.07.2003, 11:06 |
|
||
|
Хитро преобразовать строку в целое
|
|||
|---|---|---|---|
|
#18+
Sti дал верное решение. В дополнение: Доказательство того, что чисел хватит для представления комбинаций: Количество всевозможных комбинаций символов и чисел: Х = 36*36*36*36*36*36=36^6=2 176 782 336 Количество комбинаций в 4х байтовом представлении: Y=2^(4*8)=2^32 = 4 294 967 296 X<Y, что и требовалось доказать. Кто и это не понял - найдите какую-нить книжку про системы счисления, прочитайте. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 01.07.2003, 12:28 |
|
||
|
Хитро преобразовать строку в целое
|
|||
|---|---|---|---|
|
#18+
Циничный Кот, спасибо. Избавил меня от необходимости еще и это объяснять. vinalik > Ведь один символ – всегда один байт!!! Нет. Один байт - это 8 бит. Символы тут вообщем то ни при чем. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 01.07.2003, 12:45 |
|
||
|
Хитро преобразовать строку в целое
|
|||
|---|---|---|---|
|
#18+
2 sti Пожалуйста :о) 2 vinalik Ведь один символ – всегда один байт!!! Кстати, не всегда. Что-то вертится у меня на краю памяти такие умное слово как UNICODE. Интересно, к чему бы это???... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 01.07.2003, 13:21 |
|
||
|
Хитро преобразовать строку в целое
|
|||
|---|---|---|---|
|
#18+
Уважаемый Циничный Кот, 1.насчет систем счисления – в последовательности 6 символов из 36 могут быть и повторы, к примеру АААААА, 36777V. Каково теперь количество возможных комбинаций???(Почитайте учебник по комбинаторике что такое сочетания, перестановки и размещения) 2.О том что один символ – не всегда один байт и символы тут ни при чем: Я рассматривал данную задачу с точки зрения к примеру : есть последовательность символов – надо на основании ее получить к уникальное имя файла или чтото подобное. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 01.07.2003, 14:22 |
|
||
|
Хитро преобразовать строку в целое
|
|||
|---|---|---|---|
|
#18+
vinalik, упрости слегка задачу. Забудь для начала про символы. Оставь одни цифры. И попробуй решить :) Когда решишь, поймешь о чем мы тут толкуем. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 01.07.2003, 15:00 |
|
||
|
Хитро преобразовать строку в целое
|
|||
|---|---|---|---|
|
#18+
2 vinalik насчет систем счисления – в последовательности 6 символов из 36 могут быть и повторы, к примеру АААААА, 36777V. Каково теперь количество возможных комбинаций??? Это смотря каких комбинаций. Если для вас последовательности 01 и 10 - это одно и то же, тогда количество возможных комбинаций будет меньше, чем то, которое я указал. Интересно было бы, правда, если бы вам зарплату/стипендию платили по тому же принципу - один хрен, что 10, что 01... Кому-кому там знания в комбинаторике освежить надо?? Что касается задачи - я ее решал так, как написано. А написано там так: ...Необходимо разработать процедуру, которая будет формировать целое число (4 байта), однозначно соответствующее данной строке... Жую дальше: Вход: строка из 6 символов: x Выход: int32: y Функция: y=f(x) Условие на f: (x1,y1=f(x1)); (x2,y2=f(x2)). if x1<>x2 then y1<>y2. Вышеописанный алгоритм этому условию удовлетворяет. ЗЫ. А задача действительно олимпиадная класса для 8-9. Когда они там начинают информатику-то изучать... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 01.07.2003, 17:43 |
|
||
|
Хитро преобразовать строку в целое
|
|||
|---|---|---|---|
|
#18+
А про RADIX-50 никто вспомнить не может? (кодирование символов 3 байта в 2) Ну на худой конец UUEncode или MIME-64... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 07.07.2003, 06:10 |
|
||
|
Хитро преобразовать строку в целое
|
|||
|---|---|---|---|
|
#18+
2vinalik: alexeyvg тебе написал неплохой вариант... почитай про hash-функции, может тебе нужны именно они. Самый простой пример такой функции - это сумма s при 1 <= i <= 6. Она, конечно, не удовлетворяет твоим требованиям, но это только пример. P.S. К вопросу о байтах и символах: комбинаторика здесь не при чем. Ну, в смысле можно и ее, конечно, приплести. Но зачем же усложнять... В байте и без того не так уж и мало информации сохранить можно...:-) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 07.07.2003, 14:32 |
|
||
|
Хитро преобразовать строку в целое
|
|||
|---|---|---|---|
|
#18+
Друзья мои! Насчет комбинаторики, я писал о количестве вариантов: помоему предложен вариант без учета повторов ( хотя это на вскидку, может я и не прав) к примеру сссстр, строка, сттттт. Чего я действительно не понял, и хотелбы чтобы мне объяснили , почему к примеру 45376 - это не 5 байт ( я не профессиональный программист). И имеет смысл описать практический смысл даной задачи. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 10.07.2003, 21:04 |
|
||
|
Хитро преобразовать строку в целое
|
|||
|---|---|---|---|
|
#18+
2 vinalik Неее... Вы все-таки прочитайте (или перечитайте) соответующие книжки еще раз. У меня разжевывать основы никогда терпения не хватало. Хотя ладно, попробую объяснить на пальцах. Что такое "байт"???... Это - комбинация из восьми битов. Позиции битов различимы - мы знаем, какой бит первый, а какой - последний. Что такое "бит"???... Это - некоторая сущность, могущая принимать два значения. Обратите внимание, что я не уточняю, какие именно значения. Тут надо понимать, что и байт и бит - это некие абстракции, отвязанные от конкретного представления. Поэтому вот такая штука - 8 деревянных ячеек в ряд, в которые можно класть шарики вполне может представлять байт и бит соответственно. Где-то далеко на физическом уровне в компьютере такие же ячейки представлены в виде набора транзисторов, значения в котором определяются соответствующим напряжением. Но нам удобно мыслить о бите, как об абстракции. Для определенности первое значение, которое может прнимать бит, мы обозначим как "0", второе - как "1". Бит может принимать либо одно, либо другое значение. Бита "без значения" быть не может. Следующий вопрос, о котором редко задумываются - а почему в байте 8 бит???... А хрен его знает, исторически так сложилось. Хотя теоретически там может быть N бит, где N - произвольное число. Следующий вопрос - решение практической задачи. Нам надо перенумеровать X однородных предметов. (зачем это надо, я тоже не обсуждаю, это вотчина постановщика задач. Надо, и все тут). Вопрос - сколько ячеек нам понадобится для того, чтобы дать уникальную (отличимую от других) комбинацию для каждого предмета? Или, иными словами, какое количество комбинаций представимо комбинацией из N битов? Считаем: N=1, понятно дело, что один бит дает только две комбинации - 0 или 1. Значит байт из одного бита может обслужить два предмета. N=2. Почесав репу, догадываемся, что два бита нам дают 4 комбинации: 00,01,10,11 ЗЫ. Маленький шажок в сторону комбинаторики. Обратим внимание, что мы имеем дело с различимыми позициями. А именно, комбинации 01 и 10 - это не одно и то же. Возвращаясь к ранее обсуждаемому примеру с шариками (пусть они у нас 2х цветов - черные и белые), мы понимаем, что когда слева - белый шарик, а справа - черный, это совсем не то, когда наоборот. Если бы мы наши шарики клали не в ячейки, а, скжем, в мешочек - ситуация выглядела бы совсем по-другому. Мы могли бы сказать только то, что в мешочке находятся один черный и один белый шарик. И все. Общее количество комбинаций равнялось бы 3, а не 4. Кто и этого сейчас не понимает - вперед на скамью первого курса института изучать комбинаторику. Остальным вам заниматься пока рано. ;о) Так вот... Почесав решу еще раз, мы соображаем, что каждое добавление бита в наш резиновый байт увеличивает доступное количество комбинаций в два раза. И для байта разрядности N количество комбинаций выражается простой формулой: 2*2*2*...*2 = 2^N Соответственно для компьютерного байта разрядности 8 имеем: 2^8=256 256 произвольных предметов можно пренумеровать. В компьютере это используется для перенумеровывания символов. Таблица соответствия (байт)<->(символ) называется кодовой таблицей. Легко можно догадаться, что вариантов перенумеровывания существует не один. Следовательно, мы имеем дело с разными кодовыми таблицами, где одному и тому же байту могут соответствовать разные символы. Это, с одной стороны, дает определенную гибкость, а с другой служит предметом постоянного геморроя, когда вместо должной таблицы используется другая и вместо буковок на экране вы любуетесь нечитаемыми крокозяблами. Легко понять, что если каждый человек будет пользоватся собственноизобретенной таблицей, никто никогда друг друга не поймет. Чтобы хоть как-то упорядочить это дело, вводятся стандарты. Самым известным и очень старым является стандарт ASCII, фиксирующий соответствие первых 127 байт определенным символам. Английские буквы и цифры в этот набор входят, поэтому с ними обычно меньше проблем. Далее. Что такое цифра??? Цифра - это некоторая загогулина, призваная отличить разные значения бита. В двоичной системе счисления этих загогулин всего две. Мы про них говорили раньше, обозначив их 0 и 1. В десятичной системе таких загогулин, соответственно, десять: 0123456789. К чему я это объснял??? А чтобы ответить на этот вопрос: Чего я действительно не понял, и хотелбы чтобы мне объяснили , почему к примеру 45376 - это не 5 байт Теперь отвечаю. 5 байт достаточно, чтобы представить любое десятичное число с пятью разрядами. Вернее, все комбинации символов от 0 до 9. НО. Эти же комбинации можно представить МЕНЬШИМ числом байт. Почему? Легко посчитать: Общее количество комбинаций 5-разрядного десятичного числа Х=10^5 Общее количество комбинаций, представимых 5ю 8и разрядными байтами: Y=2^(5*8)=2^40=1 099 511 627 776 ~= 1.1 *10^12. Видно, что Y много больше Х. Это означает, что биты в 5 байтах используются нерационально - большая часть их не используется. Возникает вопрос - сколько бит дает количество комбинаций, достаточных для перенумерования всех чисел от 0 до 100 000??? Ответ: Комбинация 17 бит. Легко проверить: Z=2^17=131 072. Два байта и один маааленькй битик. А не 5 больших байт. Выводы о практическом смысле делайте сами. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 11.07.2003, 15:27 |
|
||
|
Хитро преобразовать строку в целое
|
|||
|---|---|---|---|
|
#18+
Циничный Кот Это было классно. Я плакаль. И это называется "нет терпения". Снимаю шляпу :) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 11.07.2003, 16:47 |
|
||
|
|

start [/forum/topic.php?fid=32&msg=32200390&tid=1546910]: |
0ms |
get settings: |
9ms |
get forum list: |
13ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
52ms |
get topic data: |
10ms |
get forum data: |
2ms |
get page messages: |
50ms |
get tp. blocked users: |
1ms |
| others: | 230ms |
| total: | 373ms |

| 0 / 0 |
