Условие задачи : Выведите количество трехзначных чисел таких что сумма цифр делится на k.
Сложность : средняя .
Решение задачи :
Для начала стоит знать как найти сумму цифр в числе, про это вы можете подробно прочитать (тут)
Теперь сразу стоит сказать какие переменные нам будут нужны :
- Две переменные для того чтобы задать промежуток(количество) трехзначных чисел A и B.
- Для цикла for переменная i
- Переменная для суммы цифр в числе
- k — число на которое будем делить
- count — кол-во трехзначных чисел.
- И также нам понадобиться переменная number в которую мы занесем число , а цикле будем с ним работать.
Итого семь переменных.
Начнем мы с каркаса, в нем мы объявим переменные, и введем наш промежуток чисел :
uses crt; var i , summa, number, k, A, B, count : integer; begin write('Введите А : '); readln(A); write('Введите B : '); readln(B); end.
У нас теперь есть промежуток, но нам нужен промежуток именно трехзначных чисел, поэтому нам нужно написать условие, которое будет выводить ошибку если числа меньше 100 или больше 999 :
if ((A < 100) or (A > 999) or (B < 100) or (B > 999)) then begin writeln('Введите числа от 100 до 999'); Delay(2000); Halt; end;
Т.е. если одно из этих чисел меньше 100 или больше 999, то мы выводи ошибку и через 2 секунды выйдем из программы.
Теперь мы введем число k , т.е. число на которое будем делить и заодно присвоим переменной в которой у нас будет кол-во элементов — 0, для того чтобы не было не каких ошибок :
write('Введите число на которое будем делить : ');readln(k); count := 0;
Фуххх…. Дальше….
Для начала сделаем код нахождения суммы одного числа.
number := abs(number); summa := 0 ; while number > 0 do begin summa := summa + (number mod 10); number := (number div 10); end;
Этот код рассчитан на то что нам уже известно number.
Теперь нужно определить делиться ли это число на k, для этого нам нужно написать простое условие :
if (summa mod k = 0) then begin writeln(i); count := count + 1; end;
Т.е. после цикла у нас осталась сумма, вот от неё мы и ищем остаток от деления.
Всё что нам осталось это весь этот бред(цикл и условие) засунуть в другой цикл :
for i:=A to B do begin number := i ; number := abs(number); summa := 0 ; while number > 0 do begin summa := summa + (number mod 10); number := (number div 10); end; if (summa mod k = 0) then begin writeln(i); count := count + 1; end; end;
Практически нечего не поменялось. Давайте примерно посмотрим как это работает.
Допустим у нас промежуток от 100 до 150, т.е.
for i:=A(100) to B(150) do
Дальше мы переменной number присваиваем число i , т.е. 100 и ищем от него модуль и обнуляем сумму.
Затем мы ищем сумму цифр числа, потом мы проверяем делиться ли она на k, если делиться то выводим его и кол-во таких чисел увеличиваем на 1.
Затем цикл повторяется, в переменной number уже будет 101 и так далее.
Весь код программы :
uses crt; var i , summa, number, k, A, B, count : integer; begin clrscr; write('Введите А : '); readln(A); write('Введите B : '); readln(B); if ((A < 100) or (A > 999) or (B < 100) or (B > 999)) then begin writeln('Введите числа от 100 до 999'); Delay(2000); Halt; end; write('Введите число на которое будем делить : ');readln(k); count := 0; for i:=A to B do begin number := i ; number := abs(number); summa := 0 ; while number > 0 do begin summa := summa + (number mod 10); number := (number div 10); end; if (summa mod k = 0) then begin writeln(i); count := count + 1; end; end; writeln('Кол-во элементов равно ', count); readln; end.