Сложить два числа без учета переносов разряда
Умножения элементов массива слов без учета переносов на TASM
Здраствуйте! Помогите пожалуйста. Нужно написать программу умножения елементов масива слов без.
Сложить два четырехбайтовых числа без знака
Составить программу на ассемблере, которая складывает два четырехбайтовых числа без знака D1 и D2.
Как можно сложить два вещественных числа без потери точности?
Я понимаю почему появляется погрешность, но не понимаю, как от неё избавляться, как можно поступить?
Сложить два числа, записанные в римской системе счисления без перевода в десятичную систему счисления
Дано задание: Сложить два числа, записанные в римской системе счисления (без перевода в десятичную.
2421 / 1463 / 633
Регистрация: 01.11.2021
Сообщений: 2,269
1 2 3 4 5 6 7 8 9 10 11
def foo(n1, n2): r = 0 i = 0 while n1 or n2: r += (n1 % 10 + n2 % 10) % 10 * 10 ** i n1, n2 = n1 // 10, n2 // 10 i += 1 return r print(foo(123, 99))
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
Помогаю со студенческими работами здесь
Отсечь программно два последних разряда шестандацатеричного числа
Здравствуйте. Есть шестнадцатиричное число 756E6547. Можно ли как-то "отсечь" программно два.

Проинвертировать два младших разряда старшего байта числа
Помогите написать задачку. Задано целое число. Надо проинвертировать два младших разряда.
Как сложить два плюс два? если оба числа символьные?
Не могу сложить два числа в символьном виде, что бы получить третье (как сумма двух первых).

Функция: вернуть значение определенного разряда восьмибитного числа (номер разряда передается в качестве аргумента)
Написать функцию, которая возвращает значение определенного разряда восьмибитного числа. Номер.

Даны два числа: одно размером dd, другое dw. Сложить эти числа
Дана задачка на ассемблере помогите сделать, а то совсем не шарю Даны два числа одно размером -.
Два числа заданы на ленте двумя массивами меток Сложить эти числа
4. Два числа заданы на ленте двумя массивами меток. Сложить эти числа. Расстояние между массивами.

Даны два длинных целых числа (256+) требуется сложить эти числа
Даны два длинных целых числа (256+ символов) требуется сложить эти числа,и подсчитать что получилось
Как сложить два числа из строки?
У меня есть переменная, где хранится строка number = «2+2» Как сделать так, чтобы python сложил эти 2 числа?
Отслеживать
3,076 2 2 золотых знака 11 11 серебряных знаков 36 36 бронзовых знаков
задан 8 окт в 10:41
Artuom Jdkd Artuom Jdkd
61 4 4 бронзовых знака
3 ответа 3
Сортировка: Сброс на вариант по умолчанию
number = eval(number)
Функция eval() преобразует и вычисляет переданные ей в виде строки выражения.
Вообще, использование функций eval() и exec() чревато ошибками и проблемами безопасности. Подробнее здесь.
Отслеживать
ответ дан 8 окт в 10:52
1,965 2 2 золотых знака 6 6 серебряных знаков 25 25 бронзовых знаков
А можно вот так:
number = '2+2' print(sum(map(int, number.split('+'))))
Притом это будет работать даже со строкой 2+2+2 .
Отслеживать
ответ дан 8 окт в 11:35
2,560 4 4 золотых знака 9 9 серебряных знаков 25 25 бронзовых знаков
Да, eval() хороший метод, но возможны не очень хорошие вводы данных, когда вы будете работать с input() (типа команды удаления диска С), поэтому:
- Можно использовать условную конструкцию if :
number='2+2' if number.replace('*','').replace('+','').replace('-','').replace('/','').isdigit(): number=eval(number) print(f'Ответ: ') else: print('Ошибка: введено не число')
- Использовать регулярки (регулярные выражения):
import re number='2x2' x=True number_split=re.split('[+*-//]', number) for i in number_split: if i.isdigit(): continue print('Ошибка: введено не число') x=False break if x: print(eval(number))
Произвести сложение чисел(а не строк) введенных через input()
Проблема в том, что сложение происходит для символов, как написать так, чтобы было сложение int чисел?
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
Ответы с готовыми решениями:
Произвести сортировку n строк, введенных в заданном формате, по баллам
Помогите сделать Программа вводит n строк в формате <Фамилия > <балл > <Фамилия >.

Произвести сложение всех чисел и вывести в textarea
В textarea с новой строки выводятся некоторые значения Нужно их все суммировать, и вывести в.

[NASM] Произвести сложение двух (любых) чисел
Произвести сложение двух (любых) чисел.
Произвести сложение X+Y и вычитание X-Y чисел с плавающей запятой
Представить заданные числа(125 и 10) с плавающей запятой в нормализованной форме одинарной.
2740 / 2339 / 620
Регистрация: 19.03.2012
Сообщений: 8,830
1 2 3
a = int(input("Введите первое число: ")) b = int(input("Введите второе число: ")) print("Сумма ваших чисел равна: ", a + b)
А вообще правильней вот так:
num = [int(input('Введите число №<>: '.format(i))) for i in range(1, 3)] print("Сумма ваших чисел равна:", sum(num))
4459 / 3212 / 1125
Регистрация: 21.03.2016
Сообщений: 7,949
Сообщение от alex925 
А вообще правильней вот так:
зачем такие сложности?
print("Сумма ваших чисел равна: ", int(input("Введите первое число: "))+int(input("Введите второе число: ")))
2740 / 2339 / 620
Регистрация: 19.03.2012
Сообщений: 8,830
Semen-Semenich, чтобы код читабельный и по pep был, у тебя правила не соблюдены + в моем варианте можно ввести хоть сто чисел, а у тебя будет это мягко говоря проблемно.
4459 / 3212 / 1125
Регистрация: 21.03.2016
Сообщений: 7,949
Сообщение от alex925 
ввести хоть сто чисел
согласен полностью но вопрос изначально подразумевал только 2 числа.
2740 / 2339 / 620
Регистрация: 19.03.2012
Сообщений: 8,830
Не вижу смысла обсуждать полторы строчки, кода, я уже сказал, что твой код не маштабируется и написан не по pep, мне больше добавить нечего.
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
Помогаю со студенческими работами здесь

Произвести сложение всех чисел и вывести в итог
Приветствую,пишу снова,последний этап программы,суммирование из dataGridView. Помогите довести.

Сложение введенных чисел в цикле
приветствую знатоков. подскажите пожалуйста новичку, как можно решить задачу с помощью цикла: .
Сложение введённых чисел с переводом в строку
Вести 2 числа в строки, перевести их в числовой формат, сложить и вывести в виде строки.

Сложение двух чисел, введенных с клавиатуры
Помогите, пожалуйста, с задачей по ассемблеру. Нужно сложить два числа введенных с клавиатуры и.

Сумма значений, введённых через запятую в input
Доброго времени суток! У меня стоит такая задача: В input вводятся числа через запятую.
Сложение двух вещественных чисел, введённых с клавиатуры
Помогите, пожалуйста! Очень надо просто сдать. Мне нужна подобная программа.
Если у вас нет плюсов

Мой друг Алексей ищет работу и ходит на собеседования. После которых интересуется, как бы я ответил на некоторые из заданных вопросов.
Отвечая на один такой вопрос, я слегка увлёкся, и материала набралось на целую статью. Впрочем, небольшую и несерьёзную — пятничного формата.
Хотите немного развлечься? Вопрос лёгкий. Надеюсь, вы попытаетесь ответить на него самостоятельно, прежде чем читать дальше. Итак:
«Сложить два целых числа (от 1 до 99) без использования оператора ‘плюс’. Дайте пять разных ответов»
Ну как? Придумали пять ответов? Давайте сравним. Если будет что-то такое, до чего я не додумался — добавляйте в комментарии.
Дальше — художественно обработанная «стенограмма» моего общения с другом.
Первое, что приходит в голову — «минус на минус даёт плюс»:
plus1 = lambda a,b: a - (-b) >>> plus1(22,6) 28
Видишь ошибку? Она здесь есть. И на интервью её заметят. Но не будем пока отвлекаться — в конце объясню.
Второй вариант, думаю, очевиден:
import math plus2 = lambda a,b: int(math.log10(10**a * 10**b))
Пояснение для читателей
Используется равенство a n+m = a n * a m
Соответственно, логарифм от a n+m равен n+m
С помощью модуля operator:
import operator plus3 = lambda a,b: operator.add(a,b)
Но можно и напрямую, без этого модуля:
plus4 = lambda a,b: a.__add__(b)
Впрочем, есть готовая встроенная функция:
plus5 = lambda a,b: sum([a,b])
И даже вот так можно:
plus6 = lambda a,b: list(range(a, 200, b))[1]
Или через длину строки:
plus7 = lambda a,b: len(''.join([a*'#', b*'*']))
Python вообще богат на варианты:
plus8 = lambda a,b: eval('a + b')
Тут мой товарищ возмутился, что видит плюс, а плюс использовать нельзя. Спорный вопрос. В условии говорится про оператор ‘+’, а здесь он просто символ. Хотя eval его, конечно, исполняет как оператор.
Впрочем, не буду спорить с другом:
plus9 = lambda a,b: eval('a \N b')
Пояснение для читателей
Используется символ плюса через его название в Unicode
Друг: «Мне кажется, меня тут пытаются обмануть. Что это ещё за PLUS SIGN?»
Ладно! Сейчас не будет никаких плюсов:
plus10 = lambda a,b: eval("".join(map(chr, [97, 32, 43, 32, 98])))
Пояснение для читателей
С помощью join из отдельных символов собирается строка ‘a + b’
«Так! Никаких больше eval!»
Хорошо. Кстати, я тут придумал ещё пару вариантов. Правда, с плюсом, но Python даже не будет этот плюс исполнять. Вариант первый:
import sqlite3 conn = sqlite3.connect(':memory:') cursor = conn.cursor() plus11 = lambda a,b: cursor.execute('select ? + ?', (a,b)).fetchone()[0]
Вариант второй (для Linux, FreeBSD и т.п.):
import os plus12 = lambda a,b: int(os.popen(f'expr + ').read().strip())
«Э-э-э, нет. Давай вот без этого. Только встроенными средствами Питона. А то так можно в каком-нибудь онлайн-калькуляторе два числа сложить, а потом распарсить ответ»
Эх. А я только собирался предложить что-нибудь эдакое. Что-ж. Придётся вспомнить детство. Складываем «в столбик» двоичные представления чисел:
def plus13(aa,bb): a = f'8b>' b = f'8b>' result = ['0'] * 8 carry_bit = '0' for i in range(7, -1, -1): if a[i]=='1' and b[i]=='1': result[i] = carry_bit carry_bit = '1' elif (a[i]=='1' and b[i]=='0') or (a[i]=='0' and b[i]=='1'): if carry_bit == '0': result[i] = '1' else: if carry_bit == '1': result[i] = '1' carry_bit = '0' return int(''.join(result),2)
Пояснение на примере
22 + 6 = 10110 + 00110 (считаем справа налево, всего пять шагов)
1 | 2 | 3 | 4 | 5 | ▼1 | ▼1 | | 10110 | 10110 | 10110 | 10110 | 10110 00110 | 00110 | 00110 | 00110 | 00110 ----- | ----- | ----- | ----- | ----- 0 | 00 | 100 | 1100 | 11100 = 28
Шаг 2) 1 + 1 = 10. Что не вмещается в двоичный разряд. Поэтому 0 пишем, а не вместившийся бит (бит переноса, carry bit) переходит в следующий разряд.
Шаг 3) 1 + 1 = 10 плюс бит переноса = 11. Пишем один и один переносим.
А собственно. Что это я в бирюльки играюсь? Можно обрабатывать все разряды одновременно:
def plus14(a, b): while b != 0: carry_bits = a & b a = a ^ b b = carry_bits
Пояснение для читателей
Сначала используем битовое И (&). Так мы узнаем разряды, в которых появится переполнение. Соответственно, на разряд левее нужно будет добавить биты переноса. Для этого сдвигаем полученное число на бит влево (00110
10110 00110 ----- & 00110
С помощью исключающего ИЛИ (^) устанавливаем в 0 переполненные разряды и оставляем неизменными непереполненные. Это будет второе слагаемое для следующего цикла или конечный результат, если вычисления завершены.
10110 00110 ----- ^ 10000
Можно даже сделать рекурсивный вариант:
def plus15(a, b): if b == 0: return a else: return plus15(a ^ b, (a & b)
А теперь - внимание! Барабанная дробь. Смертельный номер! Закат Солнца вручную:
import types co = types.CodeType(2, 0, 0, 2, 0, 0, b'|\x00|\x01\x17\x00S\x00', (), (), ('a','b'), '', '', 1, b'') plus16 = types.FunctionType(co, globals())
"Так. Секундочку. Что это сейчас было?"
Ты-же в курсе, что внутри функции есть CodeObject, который состоит из байт-кода Питона и нескольких параметров (определение переменных, размер стека и т.п.). Этот объект можно сгенерировать вручную и получить из него работающую функцию.
"Ну да. Ты ещё скажи, что в голове питоновские программы в байт-код компилируешь :)"
Нет, конечно. Просто я это пару дней назад смотрел и пока ещё помню.
На самом деле там несложно
>>> import dis >>> dis.dis(co) 1 0 LOAD_FAST 0 (a) 2 LOAD_FAST 1 (b) 4 BINARY_ADD 6 RETURN_VALUE
То есть, это обычное сложение через стек.
Вообще, к байткоду функции легко добраться:
>>> bytecode = plus16.__code__.co_code >>> bytecode b'|\x00|\x01\x17\x00S\x00' >>> list(bytecode) [124, 0, 124, 1, 23, 0, 83, 0]
Видно, что операции в байткоде состоят из кодов команд (opcode) и аргументов (oparg). Вот команды:
124 - LOAD_FAST # | 23 - BINARY_ADD # \x17 83 - RETURN_VALUE # S
С помощью dis.opmap и dis.opname их можно преобразовывать туда-сюда:
>>> dis.opname[124] 'LOAD_FAST' >>> dis.opmap('LOAD_CONST') 100
Аргумент операции - это номер в списке переменных. В нашем случае список состоит из двух переменных a и b, которые загоняются в стек и складываются.
Примечание: если Питон версии ниже 3.8, то там перед байт-кодом пять параметров, а не шесть (в 3.8 добавились "только позиционные аргументы").
Кстати, без модуля types можно обойтись. Переменные типа "функция" и "объект кода" можно клонировать из других объектов:
f = lambda: . function = type(f) code = type(f.__code__) co = code(2, 0, 0, 2, 0, 0, b'|\x00|\x01\x17\x00S\x00', (), (), ('a','b'), '', '', 1, b'') plus17 = function(co, globals() )
"Три точки в первой строке - это Ellipsis?"
Да. Объект-заполнитель, который здесь используется вместо pass. Появился в последних версиях.
О! Насчёт последних версий. Если у тебя Python версии 3.8+, там есть замена кодового объекта:
def plus18(a,b): . plus18.__code__ = plus18.__code__.replace( co_code=b'|\x00|\x01\x17\x00S\x00')
Видал, какая чёрная магия? Весь "обвес" остаётся от исходной функции, а меняется только нужная часть (в этом примере - байт-код).
Вообще, там не обязательно должен быть байткод в явном виде. Можно не заморачиваться с преобразованием и писать вот так:
plus18.__code__ = plus18.__code__.replace( co_code=(lambda a,b: a + b).__code__.co_code)
И, раз уж я полез во внутренности, можно задействовать подсчёт ссылок:
def plus19(a,b): lst = [] value = 0 before = sys.getrefcount(value) for i in range(a): lst.append(value) for i in range(b): lst.append(value) return sys.getrefcount(value) - before
"Что молчишь? Нет больше вариантов?"
Один ещё есть. Только я формулу забыл. Пришлось в интернете посмотреть. Через разложение косинуса суммы углов:
from math import cos, sin, acos def plus20(a,b): a = a / 200 b = b / 200 result = acos(cos(a)*cos(b) - sin(a)*sin(b)) * 200 return int(round(result, 0))
Пояснение для читателей
Используется формула cos(a+b) = cos(a)*cos(b) - sin(a)*sin(b)
Максимально возможная сумма в этой задаче - 198. А тригонометрия считается в радианах. Чтобы исключить неоднозначность и гарантированно остаться в пределах четверти круга (около полутора радиан) - я просто делю и умножаю на 200.
А пока я мысленно представлял транспортир, вспомнилась ещё и функция enumerate, которая нумерует элементы:
plus21 = lambda a,b: list(enumerate([*range(-1,a), *range(b)]))[-1][0]
Вот на этом, пожалуй, всё. Сходу больше ничего в голову не приходит. Разве что на регулярных выражениях выкрутить. Но это ты уже сам сделай в качестве домашнего задания. А мне пока выдай ещё какой-нибудь каверзный вопрос.
"Вопрос я выдам. Не вопрос. Что там с первым ответом? Где ошибка?"
Ошибка в том, что по PEP 8 не рекомендуется присваивать лямбды. Надо использовать обычное определение функции через def, т.к. это "more useful for tracebacks and string representations".
То есть, неправильно писать
fun1 = lambda a: a**2
надо использовать так:
def fun2(a): return a**2
Потому что лямбды делались именно для того, чтобы оставаться безымянными и никуда не присваиваться. Смотри:
>>> fun1 at 0x0000024FEE36F1F0> >>> fun3 = lambda a: 2 * a >>> fun3 at 0x000001A7571BA550> >>> fun2
Видишь? У всех лямбд одинаковое имя - . Когда я тебе однострочные примеры пишу - это неважно. А на собеседовании лучше делать так, как рекомендуют.
"А можно лямбде имя присвоить?"
>>> fun1.__qualname__ = 'fun1' >>> fun1
Только зачем такие сложности, если можно сразу через def объявить. Кроме того, всё ещё видно, что это лямбда:
>>> fun1.__code__.co_name ''
>>> fun2.__code__.co_name 'fun2'
При этом параметр co_name - readonly, т.е. напрямую имя не поменять. Надо использовать __code__.replace (но это только в Python 3.8+):
>>> fun1.__code__ = fun1.__code__.replace(co_name='fun1')
И ещё в одном месте:
>>> fun1.__name__ = 'fun1'
Теперь она не отличается от обычной функции:
>>> fun1.__code__.co_name 'fun1' >>> fun1.__qualname__ 'fun1' >>> fun1.__name__ 'fun1' >>> fun1
Реально проще использовать def.
И я всё ещё жду новый вопрос.
Впрочем. Забавно у вас там на собеседованиях. Самому, что-ли, сходить? Ни разу не был.