14-е задание: «Операции в системах счисления» Уровень сложности — повышенный, Требуется использование специализированного программного обеспечения — нет, Максимальный балл — 1, Примерное время выполнения — 5 минут.
Проверяемые элементы содержания: Знание позиционных систем счисления
Операнды арифметического выражения записаны в системе счисления с основанием 15.
82x19₁₅ – 6x073₁₅
В записи чисел переменной x обозначена неизвестная цифра из алфавита 15-ричной системы счисления. Определите наименьшее значение x, при котором значение данного арифметического выражения кратно 11. Для найденного значения x вычислите частное от деления значения арифметического выражения на 11 и укажите его в ответе в десятичной системе счисления. Основание системы счисления в ответе указывать не нужно.
Ответ: 7806
Показать решение:
✎ Решение с использованием программирования:
PascalABC.net:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
uses school;begin
foreach var x in'0123456789abcde'dobeginvar a := dec('82'+ x +'19',15);var b :=dec('6'+ x +'073',15);var sum := a - b;if sum mod11=0thenbegin
print(sum /11);break;endend;end.
uses school;
begin
foreach var x in '0123456789abcde' do
begin
var a := dec('82'+ x +'19', 15);
var b :=dec('6' + x +'073', 15);
var sum := a - b;
if sum mod 11 = 0 then
begin
print(sum / 11);
break;
end
end;
end.
записали в системе счисления с основанием 7. Найдите сумму цифр получившегося числа и запишите её в ответе в десятичной системе счисления.
Ответ: 276
Показать решение:
✎ Решение с использованием программирования:
PascalABC.net, Решение 1:
1
2
3
4
5
6
7
8
9
10
11
12
beginvar x,s: Biginteger;
x :=43*Biginteger.Pow(7,103)-21*Biginteger.Pow(7,57)+98;// в получившемся числе рассматриваем каждую цифру в 7-й системе сч.
s:=0;while x > 0dobegin
s:=s+ x mod7;// добавляем цифру правого разряда
x := x div7;// убираем разряд числа в 7-й системе сч.end;
println(s);end.
begin
var x,s: Biginteger;
x := 43*Biginteger.Pow(7, 103) - 21*Biginteger.Pow(7, 57) + 98;
// в получившемся числе рассматриваем каждую цифру в 7-й системе сч.
s:=0;
while x > 0 do
begin
s:=s+ x mod 7; // добавляем цифру правого разряда
x := x div 7; // убираем разряд числа в 7-й системе сч.
end;
println(s);
end.
x =43*7**103 - 21*7**57 + 98
s =0# в получившемся числе рассматриваем каждую цифру в 7-й системе сч.while x:
s+= x % 7# добавляем цифру к сумматору
x //=7# убираем разряд числа в 7-й системе сч.print( s )
x = 43*7**103 - 21*7**57 + 98
s = 0
# в получившемся числе рассматриваем каждую цифру в 7-й системе сч.
while x:
s+= x % 7 # добавляем цифру к сумматору
x //= 7 # убираем разряд числа в 7-й системе сч.
print( s )
beginvar k :=0;var x: Biginteger;
x := Biginteger.Pow(2,1024)+ Biginteger.Pow(4,64)-64;// в получившемся числе рассматриваем каждую цифру в 2-й системе сч.while x > 0dobeginif x mod2=1then k +=1;// если цифра = 1, то считаем ее
x := x div2;// убираем разряд числа в 2-й системе сч.end;
println(k);end.
begin
var k := 0;
var x: Biginteger;
x := Biginteger.Pow(2, 1024) + Biginteger.Pow(4, 64) - 64;
// в получившемся числе рассматриваем каждую цифру в 2-й системе сч.
while x > 0 do
begin
if x mod 2 = 1 then k += 1; // если цифра = 1, то считаем ее
x := x div 2; // убираем разряд числа в 2-й системе сч.
end;
println(k);
end.
PascalABC.net, Решение 2:
1
2
3
4
5
6
7
uses school;beginvar x: bigInteger;
x := Biginteger.Pow(2,1024)+ Biginteger.Pow(4,64)-64;
print(x.ToString.ToBase(2).CountOf('1'));end.
uses school;
begin
var x: bigInteger;
x := Biginteger.Pow(2, 1024) + Biginteger.Pow(4, 64) - 64;
print(x.ToString.ToBase(2).CountOf('1'));
end.
Python:
1
2
3
4
5
6
7
8
x =2**1024 + 4**64 - 64
k =0# в получившемся числе рассматриваем каждую цифру в 2-й системе сч.while x:
if x % 2==1: # если цифра = 1, то считаем ее
k +=1
x //=2# убираем разряд числа в 2-й системе сч.print( k )
x = 2**1024 + 4**64 - 64
k = 0
# в получившемся числе рассматриваем каждую цифру в 2-й системе сч.
while x:
if x % 2 == 1: # если цифра = 1, то считаем ее
k += 1
x //= 2 # убираем разряд числа в 2-й системе сч.
print( k )
С++:
1
✎ Решение теоретическое:
Существует правило:
2N = 10..02(1 единица и N нулей)
Чтобы воспользоваться этим правилом, преобразуем общее выражение к степеням двойки:
Из первого слагаемого 10…0 (1024 нуля) запомним одну единицу в старшем бите, остальные нули нас не интересуют, так как далее мы воспользуемся другим правилом — для разницы:
beginvar x: Biginteger;
x := Biginteger.Pow(49,10)+ Biginteger.Pow(7,30)-49;// в получившемся числе рассматриваем каждую цифру в 7-й системе сч.var k:=0;while x > 0dobeginif x mod7=6then k+=1;// если цифра = 6, то считаем ее
x := x div7;// убираем разряд числа в 7-й системе сч.end;
println(k);end.
begin
var x: Biginteger;
x := Biginteger.Pow(49, 10) + Biginteger.Pow(7, 30) - 49;
// в получившемся числе рассматриваем каждую цифру в 7-й системе сч.
var k:=0;
while x > 0 do
begin
if x mod 7 = 6 then k+=1; // если цифра = 6, то считаем ее
x := x div 7; // убираем разряд числа в 7-й системе сч.
end;
println(k);
end.
PascalABC.net, решение 2:
1
2
3
4
5
6
7
uses school;beginvar x: bigInteger;
x := Biginteger.Pow(49,10)+ Biginteger.Pow(7,30)-49;
print(x.ToString.ToBase(7).CountOf('6'));end.
uses school;
begin
var x: bigInteger;
x := Biginteger.Pow(49, 10) + Biginteger.Pow(7, 30) - 49;
print(x.ToString.ToBase(7).CountOf('6'));
end.
Python:
1
2
3
4
5
6
7
8
x =49**10 + 7**30 - 49
k =0# в получившемся числе рассматриваем каждую цифру в 7-й системе сч.while x:
if x % 7==6: # если цифра = 6, то считаем ее
k +=1
x //=7# убираем разряд числа в 7-й системе сч.print( k )
x = 49**10 + 7**30 - 49
k = 0
# в получившемся числе рассматриваем каждую цифру в 7-й системе сч.
while x:
if x % 7 == 6: # если цифра = 6, то считаем ее
k += 1
x //= 7 # убираем разряд числа в 7-й системе сч.
print( k )
С++:
1
✎ Решение теоретическое:
Приведем все числа к степеням 7:
720 + 730 - 72
Расставим операнды выражения в порядке убывания степеней:
730 + 720 - 72
Вспомним две формулы для работы со системами счисления:
1.
an = 10..0an2.
an - am = (a-1)..(a-1)0..0an-mm
Переведем первое число согласно формуле 1:
730 = 10..0
30
В данном числе нет цифры 6, как и в остальных числах.
Цифра 6 появляется при выполнении вычитания.
Подсчитаем все «6», используя формулу 2:
0 + (20 - 2) = 18
Получаем шестерок: 18
Результат: 18
📹 Видео (аналитическое решение)
📹 Видеорешение на RuTube здесь
uses school;beginvar x: bigInteger;
x := Biginteger.Pow(4,500)+3*Biginteger.Pow(4,2500)+ Biginteger.Pow(16,500)-1024;
print(x.ToString.ToBase(4).CountOf('3'));end.
uses school;
begin
var x: bigInteger;
x := Biginteger.Pow(4,500) + 3*Biginteger.Pow(4,2500) + Biginteger.Pow(16,500) - 1024;
print(x.ToString.ToBase(4).CountOf('3'));
end.
Python:
1
2
3
4
5
6
7
8
x =4**500 + 3*4**2500 + 16**500 - 1024
k =0# в получившемся числе рассматриваем каждую цифру в 4-й системе сч.while x:
if x % 4==3: # если цифра = 3, то считаем ее
k +=1
x //=4# убираем разряд числа в 4-й системе сч.print( k )
x = 4**500 + 3*4**2500 + 16**500 - 1024
k = 0
# в получившемся числе рассматриваем каждую цифру в 4-й системе сч.
while x:
if x % 4 == 3: # если цифра = 3, то считаем ее
k += 1
x //= 4 # убираем разряд числа в 4-й системе сч.
print( k )
С++:
1
Результат: 496
📹 Видео (аналитическое решение)
📹 Видеорешение на RuTube здесь
uses school;beginvar x: bigInteger;
x := Biginteger.Pow(8,1024)+ Biginteger.Pow(8,32)-65;
print(x.ToString.ToBase(8).CountOf('7'));end.
uses school;
begin
var x: bigInteger;
x := Biginteger.Pow(8,1024) + Biginteger.Pow(8,32) - 65;
print(x.ToString.ToBase(8).CountOf('7'));
end.
Python:
1
2
3
4
5
6
7
8
x =8**1024 + 8**32 - 65
k =0# в получившемся числе рассматриваем каждую цифру в 8-й системе сч.while x:
if x % 8==7: # если цифра = 7, то считаем ее
k +=1
x //=8# убираем разряд числа в 8-й системе сч.print( k )
x = 8**1024 + 8**32 - 65
k = 0
# в получившемся числе рассматриваем каждую цифру в 8-й системе сч.
while x:
if x % 8 == 7: # если цифра = 7, то считаем ее
k += 1
x //= 8 # убираем разряд числа в 8-й системе сч.
print( k )
С++:
1
✎ Решение теоретическое:
Приведем все числа к степеням восьмерки:
65 = 64 + 1 = 82 + 80;
Получаем:
81024 + 832 - (82 + 80);
81024 + 832 - 82 - 80
Вспомним две формулы для работы с системами счисления:
1.
an = 10..0an2.
an - am = (a-1)..(a-1)0..0an-mm
Переведем первое число согласно формуле 1:
81024 = 10..0
1024
В данном числе нет цифры 7, как и в остальных числах.
Цифра 7 появляется при выполнении вычитания. У нас два таких действия, идущих подряд. Это неудобно. Необходимо, чтобы действия чередовались (a + b — c + d — e…)
Вспомним еще одну формулу:
3.
-2n = -2n+1 + 2n
! Формула предназначена для чисел в двоичной системе счисления,
но для подсчета цифр "7" в 8-й (или "6" в 7-й и т.п.) ее можно использовать
(для поиска единиц или нулей она не подходит!!!)
В нашем случае заменим часть выражения:
-82 = -83 + 82! обратите внимание, что тождество неверно, но
при поиске количества "7" этой формулой можно воспользоваться
(для поиска единиц или нулей она не подходит!)
Получаем:
81024 + 832 - 83 + 82- 80
begin
var b2 := biginteger(2);
var numb := (2 * b2) ** 350 + (4 * b2) ** 340 - (1 * b2) ** 320 - 12;
var digit: biginteger;
var n := 0;
while numb > 0 do
begin
digit := numb mod 2;
if digit = 0 then n += 1;
numb := numb div 2
end;
print(n)
end.
PascalABC.net, решение 2:
1
2
3
4
5
6
7
uses school;beginvar x: bigInteger;
x := Biginteger.Pow(4,350)+ Biginteger.Pow(8,340)- Biginteger.Pow(2,320)-12;
print(x.ToString.ToBase(2).CountOf('0'));end.
uses school;
begin
var x: bigInteger;
x := Biginteger.Pow(4,350) + Biginteger.Pow(8,340) - Biginteger.Pow(2,320) - 12;
print(x.ToString.ToBase(2).CountOf('0'));
end.
Python:
1
2
3
4
5
6
7
x =4**350 + 8**340 - 2**320 - 12print(x)
k =0while x:
if x % 2==0: k +=1
x //=2print( k )
x = 4**350 + 8**340 - 2**320 - 12
print(x)
k = 0
while x:
if x % 2 == 0: k += 1
x //= 2
print( k )
С++:
✎ Решение теоретическое: 4350 + 8340 – 2320 – 12
По возможности приведем каждое слагаемое к степеням 2. Получим:
Далее рассуждаем так: количество нулей можно найти, если из общего количества цифр в результирующем числе вычесть количество не нулей (любых других цифр).
Расположим операнды по убыванию:
21020 + 2700 - 2320 - 23 - 22
Наибольшее число 21020, в нем 1021 разряд в двоичной с.с. (одна единица и 1020 нулей). То есть всего 1021 знаков.
Для того, чтобы избежать два подряд идущих минуса, воспользуемся правилом -2n = -2n+1+2n и преобразуем выражение:
21020 + 2700 - 2321+ 2320- 24 + 23 - 22
Посчитаем количество не нулей в каждом операнде:
21020 -> один не ноль
2700 - 2321 -> 379 не нулей
2320- 24 -> 316 не нулей
23 - 22 -> один не ноль
Итого: 1+ 379+316 +1 = 697
Теперь добавим промежуточные числа в троичной системе счисления (прибавляя единицу к каждому очередному полученному числу), не забывая, что в троичной системе всего три цифры (0, 1 и 2):
Некоторое число X из десятичной системы счисления перевели в системы счисления с основаниями 16, 8. Часть символов при записи утеряна. Позиции утерянных символов обозначены *:
Данные числа с утерянными символами переведем из 16-й и из 8-й системы счисления в двоичную. Перевод будем делать триадами и тетрадами, неизвестные позиции оставим пустыми:
Сопоставим известные и неизвестные биты в обеих получившихся масках:
* * 0 0 0 1 0 1
Неизвестными остались 7-й и 8-й бит. Они не могут быть одновременно нулями, так как для *0*8 тогда исчезнет старший разряд. Поэтому оставшиеся варианты будут такими:
1. 01000101
2. 10000101
3. 11000101
Итого 3 варианта.
📹 Видео (аналитическое решение
📹 Видеорешение на RuTube здесь)
Malbaro27
a = []
x = 2 ** 5 * 3 ** 25
while x > 0:
a.append(x % 3)
x = x // 3
a.reverse()
print(a)
Некоторые задания можно решать через python, используя word для подсчета нужного числа.