Skip to main content

Задание 14

В этом задании нужно сложить большие числа и сказать, сколько в них тех или иных цифр

Пример 1

Задача

Значение арифметического выражения: 497+721749^7 + 7^{21} – 7 – записали в системе счисления с основанием 77. Сколько цифр 66 содержится в этой записи?

import java.math.BigInteger;

public class Example2 {
public static void main(String[] args) {
// первое значение
BigInteger value1 = BigInteger.valueOf(49).pow(7);
// второе значение
BigInteger value2 = BigInteger.valueOf(7).pow(21);
// третье
BigInteger value3 = BigInteger.valueOf(7);
// вычисляем результат
BigInteger result = value1.add(value2).subtract(value3);
// формируем строку представляющее число в семеричной системе счисления
String resultString = result.toString(7);
// кол-во нужных цифр 0
int cnt = 0;
// перебираем все цифры
for (char c : resultString.toCharArray()) {
// если цифра равна 6
if (c == '6')
// увеличиваем кол-во на 1
cnt++;
}
// выводим кол-во символов
System.out.println(cnt);
}
}

Программы выведет:

13

Ответ: 13.

В Java есть готовый инструмент для работы с ддлинной арифметикой. Для этого вам понадобится класс BigInteger. Чтобы создать длинное число, необходимо вызвать команду:

    BigInteger value1 = BigInteger.valueOf(49);

Команды можно вызывать подряд, например, чтобы получить число 49749^7, необходимо вызвать подряд две команды

    BigInteger value1 = BigInteger.valueOf(49).pow(7);

первая valueOf() создаёт длинное число, вторая pow() - возводит созданное прошлой командой число в заданную степень.

Вычетание subtract() и сложение add() тоже можно вызывать цепочкой.

    BigInteger result = value1.add(value2).subtract(value3);

Обратите внимание: add() и subtract() в качестве аргументов принимают только объекты BigInteger.

В C++ нет готового инструмента для работы с длинной арифметикой, поэтому придётся писать её самостоятельно. Правда, в задании только сложение, вычетание и возведение основания в степень. Поэтому можно просто написать эти три метода.

Обычно длинная арифметика реализуется на строках, но в нашем случае проще использовать целочисленный вектор. Да, такое решение сильно неоптимальное, но на ЕГЭ надо просто решить задачу, поэтому чем проще написать работающую программу, тем лучше.

В Python эта задача решается проще всего, оптому что у него число по умолчанию может быть длинным, поэтому программа состоит буквально из нескольких строк кода.

Пример 2

Задача

Сколько значащих нулей в двоичной записи числа

4512+851221282504^{512} + 8^{512} – 2^{128} – 250

import java.math.BigInteger;

public class Example2 {
public static void main(String[] args) {
// первое значение
BigInteger value1 = BigInteger.valueOf(4).pow(512);
// второе значение
BigInteger value2 = BigInteger.valueOf(8).pow(512);
// третье
BigInteger value3 = BigInteger.valueOf(2).pow(128);
// четвёртое
BigInteger value4 = BigInteger.valueOf(250);

// вычисляем результат
BigInteger result = value1.add(value2).subtract(value3).subtract(value4);

// формируем строку представляющее число в двоичной системе счисления
String resultString = result.toString(2);
// кол-во нужных цифр 0
int cnt = 0;
// перебираем все цифры
for (char c : resultString.toCharArray()) {
// если цифра равна 6
if (c == '0')
// увеличиваем кол-во на 1
cnt++;
}
// выводим кол-во символов
System.out.println(cnt);
}
}

Программа выведет:

519

Пример 3

Задача

Решите уравнение

608+x=120760_8+x=120_7

Ответ запишите в шестеричной системе счисления. Основание системы счисления указывать не нужно.

удобнее всего перевести все числа в десятичную систему, решить уравнение и результат перевести в шестеричную систему

получаем

608=681+080=48, 1207=172+271=6360_8=6*8^1+0*8^0=48,~ 120_7=1*7^2+2*7^1=63

уравнение приобретает вид

48+x=6348+x=63

откуда получаем

x=15x =15

переводим 15 в шестеричную систему счисления:

15=261+360=23615=2*6^1+3*6^0=23_6

Ответ: 23_6

Пример 4

Задача

Запись числа 38110381_{10} в системе счисления с основанием N оканчивается на 3 и содержит 3 цифры. Укажите наибольшее возможное основание этой системы счисления N.

Проще всего перебрать все представления числа в разных системах счисления, начиная с очень большого. Как только будет найдено подходящее основание, остановим цикл.

public class Example3 {
public static void main(String[] args) {
// исходное число
int val = 381;
// перебираем основания
for (int i = 32; i >= 0; i--) {
// создаём строку с представлением перебираемого значения
// в системе счиления с основанием i
String s = Integer.toString(val, i);
// если число оканчивается на тройку и содержит три цифры
if (s.charAt(s.length()-1)=='3'&&s.length()==3){
// выводим основание
System.out.println(i);
// останавливаем цикл
break;
}
}
}
}

Программа выведет:

18

Ответ: 18

Задания для самостоятельного выполнения