Информатика егэ №13373. проверьте, правильно ли написана программа на python, и является ли она эффективной по времени и по памяти:
на спутнике «восход» установлен прибор, предназначенный для измерения солнечной активности. в течение времени эксперимента (это время известно заранее) прибор каждую минуту передаёт в обсерваторию по каналу связи положительное целое число, не превышающее 1000, — количество энергии солнечного излучения, полученной за последнюю минуту, измеренное в условных единицах.
после окончания эксперимента передаётся контрольное значение — наибольшее число r, удовлетворяющее следующим условиям:
1) r — произведение двух чисел, переданных в разные минуты;
2) r делится на 26.
напишите эффективную по времени и используемой памяти программу, которая будет проверять правильность контрольного значения.
программа должна напечатать отчёт по следующей форме.
вычисленное контрольное значение: …
контроль пройден (или контроль не пройден)
если удовлетворяющее условию контрольное значение определить невозможно, то выводится только фраза «контроль не пройден». перед текстом программы кратко опишите используемый вами алгоритм решения.
на вход программе в первой строке подаётся количество чисел n ≤ 100 000. в каждой из последующих n строк записано одно положительное целое число, не превышающее 1000. в последней строке записано контрольное значение.
программа:
n = int(
m26, m13, m2, m = 0, 0, 0, 0
for i in range(n):
num = int(
if num % 26 == 0 and num > m26:
m26 = num
elif num % 13 == 0 and num > m13:
m13 = num
elif num % 2 == 0 and num > m2:
m2 = num
elif num > m:
m = num
ans = max(m13*m2, m13*m26, m26*m, m26*m2,)
r = int(
print('вычисленное контрольное значение: ', ans)
print('контроль пройден' if ans == r else 'контроль не пройден')
#include <iostream>
using namespace std;
int main()
{
int n;
cin >> n;
int maxdigit = 0;
while (n > 0) {
int digit = n % 10;
if (digit > maxdigit)
maxdigit = digit;
n /= 10;
}
cout << maxdigit;
return 0;
}
Уровень D
#include <iostream>
using namespace std;
int main(){
int n;
cin >> n;
int prev = -1;
while (n > 0) {
int digit = n % 10;
if (digit == prev) {
cout << "YES";
return 0;
}
prev = digit;
n /= 10;
}
cout << "NO";
return 0;
}
Приведём все числа к степеням тройки, учитывая, что
25 = 27-2 = 3^3-2∙3^0
27^4 – 9^5 + 3^8 – 25 = (3^3)^4 - (3^2)^5 + 3^8 - 3^3 + 2∙3^0 =
(3^12 - 3^10) + (3^8 - 3^3) + 2∙3^0
Найдем значение разности в первой скобке, учитывая что 12-ая степени тройки в троичной системе это 1000000000000(3), а 10-ая степень - это 10000000000(3)
1000000000000(3)
-
10000000000(3)
220000000000(3)
Т.е. в троичной записи 12–10 = 2 «двойки» и 10 «нулей».
Вычислим аналогично вторую скобку:
100000000(3)
-
1000(3)
22222000(3)
Т.е. в троичной записи 8–3 = 5 «двоек» и 3 «нуля».
Таким образом, общее количество двоек = 2+5+1 = 8
2) 3∙16^8 – 4^5 + 3 (см. рис)
Приведём все числа к степеням четверки:
3∙16^8 – 4^5 + 3 = 3∙(4^2)^8 – 4^5 + 3∙4^0 = 3∙4^16 – 4^5 + 3∙4^0
Найдем значение разности, учитывая что 3∙4^16 в системе счисления с основанием 4 это одна «тройка» и 16 «нулей», а 4^5 - это одна «единица» и 5 «нулей»:
30000000000000000(4)
-
100000(4)
23333333333300000(4) (одна «двойка», 11 «троек» и 5 «нулей»)
Таким образом, общее количество троек = 11+1 = 12
3) 4^1024 + 8^1025 – 2^1026 – 140
Количество значащих нулей равно количеству всех знаков в двоичной записи числа минус количество единиц.
Приведём все числа к степеням двойки, учитывая, что 140 = 128 + 8 + 4
4^1024 + 8^1025 – 2^1026 – 140 =
(2^2)^1024 + (2^3)^1025 – 2^1026 – (2^7+2^3+2^2) =
2^3075 + 2^2048 – 2^1026 – 2^7 - 2^3 - 2^2
Старшая степень двойки – 3075, двоичная запись этого числа представляет собой единицу и 3075 нулей, то есть, состоит из 3076 знаков; таким образом, остаётся найти количество единиц.
Представим далее -2^1026 = -2^1027 + 2^1026, получим:
2^3075 + 2^2048 - 2^1027 + 2^1026 – 2^7 - 2^3 - 2^2
Аналогично – 2^7 = - 2^8 + 2^7, получим:
2^3075 + 2^2048 - 2^1027 + 2^1026 - 2^8 + 2^7 - 2^3 - 2^2
И, наконец, - 2^3 = - 2^4 + 2^3
2^3075 + (2^2048 - 2^1027) + (2^1026 - 2^8) + (2^7 - 2^4) + (2^3 - 2^2)
Вспомним свойство: число 2^N–2^K при K < N записывается как N–K единиц и K нулей.
Общее число единиц = 1+(2048-1027)+(1026-8)+(7-4)+(3-2) = 2044
Таким образом, количество значащих нулей равно 3076-2044 = 1032