Есть ли способ конвертировать строки в целые числа без использования умножения. Реализация int.Parse () также использует умножение. У меня есть другие подобные вопросы, где вы можете вручную преобразовать строку в int, но это также требует умножения числа на его основание 10. Это был вопрос интервью, который у меня был в одном из интервью, и я не могу найти какой-либо ответ по этому поводу.
9
x<<1 + x<<3
), но это все еще способ использования умножения, поэтому трудно сказать, «в духе» этого вопроса ...for (int i = 0; i < 10; i++) result += number;
?Ответы:
Если принять систему счисления с основанием 10 и заменить умножение сдвигами битов ( см. Здесь ), это может быть решением для натуральных чисел .
Смотрите пример на ideone .
Единственное предположение заключается в том, что символы
'0'
должны'9'
лежать непосредственно рядом друг с другом в наборе символов. Цифровые символы преобразуются в их целочисленные значения с помощьюcharacter - '0'
.Редактировать:
Для отрицательных целых чисел эта версия ( см. Здесь ) работает.
В общем, вы должны учитывать ошибки, такие как проверка на ноль, проблемы с другими нечисловыми символами и т. Д.
источник
Это зависит. Мы говорим о логической операции умножения, или как это на самом деле делается в аппаратном обеспечении?
Например, вы можете преобразовать шестнадцатеричную (или восьмеричную, или любой другой базовый множитель два) в целое число «без умножения». Вы можете идти символ за символом и продолжать oring (
|
) и bithifting (<<
). Это позволяет избежать использования*
оператора.Делать то же самое с десятичными строками сложнее, но у нас все еще есть простое сложение. Вы можете использовать циклы с дополнением, чтобы сделать то же самое. Довольно просто сделать. Или вы можете создать свою собственную «таблицу умножения» - надеюсь, вы научились умножать числа в школе; Вы можете сделать то же самое с компьютером. И, конечно же, если вы работаете на десятичном компьютере (а не на двоичном), вы можете выполнить «битовое смещение», как и в предыдущей шестнадцатеричной строке. Даже с двоичным компьютером вы можете использовать серию битовых сдвигов -
(a << 1) + (a << 3)
это то же самое, что иa * 2 + a * 8 == a * 10
. Осторожнее с отрицательными числами. Вы можете найти множество хитростей, чтобы сделать это интересным.Конечно, оба они являются замаскированным умножением. Это потому, что позиционные числовые системы по своей сути мультипликативны . Вот как работает это конкретное числовое представление. У вас могут быть упрощения, которые скрывают этот факт (например, нужны только двоичные числа
0
и1
, таким образом, вместо умножения вы можете иметь простое условие - конечно, то, что вы действительно делаете, это все еще умножение, только с двумя возможными входами и двумя возможными выходы), но она всегда есть, таится.<<
то же самое* 2
, даже если аппаратное обеспечение, которое выполняет операцию, может быть проще и / или быстрее.Чтобы полностью отказаться от умножения, вам нужно избегать использования позиционной системы. Например, римские цифры являются аддитивными (обратите внимание , что фактические римские цифры не использовать правила компактификации мы имеем сегодня - четыре бы
IIII
, неIV
, и четырнадцать могли быть написаны в любой форме , какXIIII
,IIIIX
,IIXII
, иVVIIII
т.д.). Преобразование такой строки в целое число становится очень простым - просто переходите от символа к символу и продолжайте добавлять. Если персонаж естьX
, добавьте десять. ЕслиV
добавить пять. ЕслиI
, добавить одну. Я надеюсь, вы понимаете, почему римские цифры так долго оставались популярными; позиционные числовые системы прекрасны, когда вам нужно много умножения и деления. Если вы в основном имеете дело с сложением и вычитанием, римские цифры работают отлично и требуют гораздо меньшего обучения (а счеты гораздо проще в создании и использовании, чем позиционный калькулятор!).С подобными заданиями можно многое узнать о том, чего на самом деле ожидает интервьюер. Может быть, они просто хотят увидеть ваши мыслительные процессы. Вы
<<
принимаете технические аспекты (на самом деле это не умножение)? Знаете ли вы теорию чисел и информатику? Вы просто погружаетесь в свой код или просите разъяснений? Считаете ли вы это забавным испытанием или еще одним смешным скучным вопросом для собеседования, который не имеет никакого отношения к вашей работе? Мы не можем сказать вам ответ, который искал интервьюер.Но я надеюсь, что я хотя бы дал вам представление о возможных ответах :)
источник
Учитывая, что это вопрос интервью, производительность не может быть высоким приоритетом. Почему бы просто:
Если переданная строка не является целым числом, метод сгенерирует исключение переполнения.
источник
public int StringToInt(string value, int search_from = int.MinValue) => value == search_from.ToString() ? search_from : StringToInt (value, ++search_from);
Enumerable.Range(int.MinValue, int.MaxValue).First(i => i.ToString() == stringValue
.Любое умножение можно заменить повторным сложением. Таким образом, вы можете заменить любое умножение в существующем алгоритме версией, которая использует только сложение:
Вы можете пойти дальше и написать специальную строку для Int, используя эту идею, которая минимизирует количество добавлений (отрицательное число и обработка ошибок опущены для краткости):
Но я не думаю, что это стоит того, так как производительность здесь не является проблемой.
источник