Delphi две простые программы - 1. Даны длины сторон прямоугольного параллелепипеда. Найти его объем и площадь боковой поверхности. 2. Написать программу, которая определяет, принадлежит ли число N заданному интервалу |К, L].
Ну а так то по идее это задание считается на бумажке, используя знания о системах счисления:
Каждое из этих слагаемых приводится к виду a * 3^b. Получим:
1 * 3^2020
-2 * 3^1010
1 * 3^1200
2 * 3^3
В троичной системе эти числа будут выглядеть как a000000... (число нулей равно b). То есть, в нашем случае, так:
10000...(всего 2020 нулей)
-20000...(всего 1010 нулей)
1000...(всего 1200 нулей)
2000 (тут всего 3 нуля)
Далее- складываем все положительные слагаемые (их три), по порядку от большего к меньшему. Получим сумму вида a1 00...00 a2 00...00 a3 000, с большим числом нулей между тремя ненулевыми разрядами (не нужно полностью записывать эти нули, достаточно записать сокращённо, как я записал выше). В нашем случае получим:
100...00100...002000 (троичное число)
Затем вычитаем из этой суммы все отрицательные слагаемые (у нас такое только одно). При вычитании произойдёт последовательное заимствование единицы (в разрядах равных нулю)- вплоть до первого ненулевого разряда. Он уменьшится на единицу, а все нулевые разряды в которых была занята единица, станут равны двум. Вот тут уже нужно будет посчитать число нулевых разрядов, которые были между старшим разрядом в отрицательном слагаемом и ближайшим ненулевым разрядом в ранее полученной сумме- и мы получим число двоек, возникшее в разрядах при вычитании (и, если бы вычитали число начинающееся с единицы, то его старший разряд дал бы ещё одну двойку). Итак, при вычитании мы получим вот что:
Жирным шрифтом я выделил разряды, соответствующие 1200-ой и 1010-ой степени тройки. В первом из них была единица, из которой заняли единицу, и она превратилась в ноль. Во втором из них был ноль, из которого вычли два, и (после того как заняли единицу в старшем разряде) получили один (в троичном виде это выглядит как 10-2=1, а в десятичном виде выглядит как 3-2=1).
Посчитаем, сколько разрядов было между этими двумя разрядами:
1200 - 1010 - 1 = 189 (разрядов)
Во всех этих 189 разрядах был ноль, а после вычитания во всех них появились двойки.
И ещё одна двойка была у нас в конце суммы, она никуда не делась и при вычитании.
Поэтому общее число двоек в троичной записи значения этого выражения будет равно:
содержится 190 цифр "2"
Объяснение:
Считал в программе на Паскале (скрин окна вывода смотри на приложенной внизу картинке):
// проверено в PascalABC.NET 3.4.2, сборка 1837 от 12.10.2018
var
a, t, x, x1, x2: BigInteger; // степени и основания степеней
y, o, n, y1, y2, c: Integer; // показатели степеней, основание СС, счётчик, константа
s, f: string; // строки- для результата и для поиска
begin
x := 3; // основание степени 1
y := 2020; // показатель степени 1
x1 := 3; // основание степени 2
y1 := 1010; // показатель степени 2
x2 := 9; // основание степени 3
y2 := 600; // показатель степени 3
c := 54; // константа
o := 3; // основание новой системы счисления (можно от 2 до 10)
f := '2'; // искомый символ, их количество считаем в числе в новой СС
s := ''; // пустая строка (тут будет число в новой СС, в формате строки)
n := 0; // счётчик искомых символов
writeln('считаем: ', x, ' в степени ', y, ' минус 2 * ', x1, ' в степени ', y1, ' плюс ', x2, ' в степени ', y2, ' плюс ', c);
a := x ** y - 2 * x1 ** y1 + x2 ** y2 + c;
writeln('в десятичной СС: ', a, ' (число разрядов= ', a.ToString.Length, ')');
t := a;
repeat
s := (t mod o).ToString + s;
if s[1] = f then n += 1;
t := t div o;
until t = 0;
writeln('в СС с основанием ', o, ': ', s, ' (число разрядов= ', s.ToString.Length, ')');
writeln('(число разрядов, содержащих "', f, '" = ', n, ' шт.)');
end.
Ну а так то по идее это задание считается на бумажке, используя знания о системах счисления:
Каждое из этих слагаемых приводится к виду a * 3^b. Получим:
1 * 3^2020
-2 * 3^1010
1 * 3^1200
2 * 3^3
В троичной системе эти числа будут выглядеть как a000000... (число нулей равно b). То есть, в нашем случае, так:
10000...(всего 2020 нулей)
-20000...(всего 1010 нулей)
1000...(всего 1200 нулей)
2000 (тут всего 3 нуля)
Далее- складываем все положительные слагаемые (их три), по порядку от большего к меньшему. Получим сумму вида a1 00...00 a2 00...00 a3 000, с большим числом нулей между тремя ненулевыми разрядами (не нужно полностью записывать эти нули, достаточно записать сокращённо, как я записал выше). В нашем случае получим:
100...00100...002000 (троичное число)
Затем вычитаем из этой суммы все отрицательные слагаемые (у нас такое только одно). При вычитании произойдёт последовательное заимствование единицы (в разрядах равных нулю)- вплоть до первого ненулевого разряда. Он уменьшится на единицу, а все нулевые разряды в которых была занята единица, станут равны двум. Вот тут уже нужно будет посчитать число нулевых разрядов, которые были между старшим разрядом в отрицательном слагаемом и ближайшим ненулевым разрядом в ранее полученной сумме- и мы получим число двоек, возникшее в разрядах при вычитании (и, если бы вычитали число начинающееся с единицы, то его старший разряд дал бы ещё одну двойку). Итак, при вычитании мы получим вот что:
100...00100..00000...002000 (троичное число)
- 200...000000 (троичное число)
-----------------------------------------------------------------------
100...00022..22100...002000 (троичное число)
Жирным шрифтом я выделил разряды, соответствующие 1200-ой и 1010-ой степени тройки. В первом из них была единица, из которой заняли единицу, и она превратилась в ноль. Во втором из них был ноль, из которого вычли два, и (после того как заняли единицу в старшем разряде) получили один (в троичном виде это выглядит как 10-2=1, а в десятичном виде выглядит как 3-2=1).
Посчитаем, сколько разрядов было между этими двумя разрядами:
1200 - 1010 - 1 = 189 (разрядов)
Во всех этих 189 разрядах был ноль, а после вычитания во всех них появились двойки.
И ещё одна двойка была у нас в конце суммы, она никуда не делась и при вычитании.
Поэтому общее число двоек в троичной записи значения этого выражения будет равно:
189 + 1 = 190 (двоек)
import java.util.Scanner;
class Main {
// getter функция, берущая значение у пользователя
static int getNumb() {
Scanner numbS = new Scanner(System.in);
int numb = numbS.nextInt();
return numb;
}
public static void main(String [ ] args) {
// Инициализация нужных переменных
int numbs[] = new int[99];
int i = 0;
int max = 0;
// До тех пор, пока не будет введён 0, будет вызываться функция getNumb
while(true) {
numbs[i] = getNumb();
if(numbs[i] == 0) {
break;
}
// Если введённый элемент массива больше переменной max, то ей присваивается этот элемент
else if(numbs[i] > max) {
max = numbs[i];
}
}
System.out.print(max);
}
}