?>
Сколько раз будет выполнен этот цикл? i = 4 while i < 2: print ( "Привет" ) i += 1 2) Чему будет равна переменная "с" после выполнения этой программы? a = 22 b = 4 b = a % b c = a // (b+1) 3) Определите, что будет напечатано в результате работы следующей программы s = 0 for k in range(14, 19): s = s + 7 print( s ) ; 4) Чему будет равна переменная "с" после выполнения этой программы a = 26 b = 6 b = a // b + b c = a % b + a 5) Какое число нужно написать вместо многоточия, чтобы цикл выполнился ровно 3 раза? i = ... while i <= 7 : print ( "Привет!" ) i += 1 6) Определите , что будет напечатано в результате работы следующей программы s = 3 for i in range(2, 6) : s = s + 2*i print( s ) ; 7) дана программа. Было проведено 10 запусков этой программы, при которых в качестве значений переменных х и у вводились следующие пары чисел: (105, 100);(95, 110);(100, 95);(95, 90);(105, 90);(85 , 110);(100 , 110);(85, 105);(85, 95);(90, 100) Сколько было запусков, при которых программа напечатала "НЕТ"? x = int ( input ( ) ) y = int (input ( ) ) if y <= 100 or x > 90: print ( "ДА" ) else : print ("НЕТ") 8) Определите значение переменной "а" после выполнения фрагмента программы a = 10 if a < 5 : a += 12 else : a -= 7 9) Дана программа. Было проведено 9 запусков этой программы, при которых в качестве значений переменных s и t вводились следующие пары чисел: (1, 2); (11, 2); (1, 12); (11, 12); (–11, –12); (–11, 12); (–12, 11); (10, 10); (10, 5)Сколько было запусков, при которых программа напечатала «НЕТ»? s = int ( input ( ) ) t = int ( input ( ) ) if s > 10 or t < 10 : print ( "ДА") else : print ( "НЕТ" ) 10) Чему будет равно значение переменной "а" после выполнения этого цикла i = 2 f = 12 while i < 5 : a += i i += 1
Ответы
ответ:Алгоритм Карацубы — метод быстрого умножения со сложностью вычисления nlog23. В то время, как наивный алгоритм, умножение в столбик, требует n2 операций. Следует заметить, что при длине чисел короче нескольких десятков знаков (точнее определяется экспериментально), быстрее работает обычное умножение.
Представим, что есть два числа A и B длиной n в какой-то системе счисления BASE:
A = an-1an-2...a0
B = bn-1an-2...a0, где a?, b? — значение в соотв. разряде числа.
Каждое из них можно представить в виде суммы их двух частей, половинок длиной m = n / 2 (если n нечетное, то одна часть короче другой на один разряд:
A0 = am-1am-2...a0
A1 = an-1an-2...am
A = A0 + A1 * BASEm
B0 = bm-1bm-2...b0
B1 = bn-1bn-2...bm
B = B0 + B1 * BASEm
Тогда: A * B = ( A0 + A1 * BASEm ) * ( B0 + B1 * BASEm ) = A0 * B0 + A0 * B1 * BASEm + A1 * B0 * BASEm + A1 * B1 * BASE2 * m = A0 * B0 + ( A0 * B1 + A1 * B0 ) * BASEm + A1 * B1 * BASE2 * m
Здесь нужно 4 операции умножения (части формулы * BASE? * m не являются умножением, фактически указывая место записи результата, разряд). Но с другой стороны:
( A0 + A1 ) * ( B0 + B1 ) = A0 * B0 + A0 * B1 + A1 * B0 + A1 * B1
Посмотрев на выделенные части в обоих формулах. После несложных преобразований количество операций умножения можно свести к 3-м, заменив два умножения на одно и несколько операций сложения и вычитания, время выполнения которых на порядок меньше:
A0 * B1 + A1 * B0 = ( A0 + A1 ) * ( B0 + B1 ) — A0 * B0 — A1 * B1
Окончательный вид выражения:
A * B = A0 * B0 + (( A0 + A1 ) * ( B0 + B1 ) — A0 * B0 — A1 * B1 ) * BASEm + A1 * B1 * BASE2 * m
Объяснение: