Написать программы для решения следующих задач (скрины ЛС в ВК): 1) Найдите четырехзначные числа, сумма цифр которых равна 15. 2) Найдите наибольшую цифру в данном натуральном числе.
На интервале с левой границей 500 первое число, кратное 13, равно 507, а первое число, кратное 17, равно 510. Числа, кратные 13, образуют последовательность 507, 520, 533, ..., а числа, кратные 17, образуют последовательность 510, 527, 544, ... Для решения задачи достаточно объединить эти последовательности в одну, упорядоченную по возрастанию и взять первых 20 её членов.
Как получить 507 и 510? Первое число m, не меньшее некоторого k и кратное n определяется по простому алгоритму. Пусть p = k mod n - остаток от целочисленного деления k на n. Если p=0, то m=k, в противном случае m=k+n-p. Проверим для k=500, n=13. p = 500 mod 13 = 6. p≠0 ⇒ m = 500+13-6 = 507.
Поскольку 17>13, в последовательности чисел, кратных 17, их не может быть больше половины искомого количества, т.е. больше 20/2=10. А десятый член последовательности 510, 257, ... это 510+9×17 = 663. Тем более, это значение не может быть превышено в последовательности чисел, кратных 13, их там будет (663-507)/13=12.
Окончательно: строим последовательности из 12 чисел ряда 507, 520, 533... и 10 чисел ряда 510, 527, 544, ... объединяем их в последовательность, упорядоченную по возрастанию и берем 20 первых ее членов.
PascalABC.NET 3.3.5, сборка 1660 от 20.04.2018 Внимание! Если программа не работает, обновите версию!
begin (SeqGen(12,507,t->t+13)+SeqGen(10,510,t->t+17)).OrderBy(t->t) .Distinct.Take(20).Println end.
def summ(m): s = 0 while m > 0: s += m % 10 m = m // 10 return s
from random import random
N = 10 a = [0] * N for i in range(N): a[i] = int(random() * 40) + 10 print('%4d' % a[i], end='') print()
for i in range(N - 1): # количество переборов 9 for j in range(N - i - 1): # при первом переборе i=0 if summ(a[j]) > summ(a[j + 1]): a[j], a[j + 1] = a[j + 1], a[j]
for i in range(N): print('%4d' % a[i], end='') print()
for i in range(N): print('%4d' % summ(a[i]), end='') print()
pascal
const N = 10; var arr: array[1..N] of integer; i, j: byte; a: integer; function sum (n: integer): byte; begin sum := 0; while n > 0 do begin sum := sum + n mod 10; n := n div 10; end; end; begin randomize; for i := 1 to N do begin arr[i] := random(20)+10; write (arr[i]:3); end; writeln;
for i := 1 to N-1 do // количество проходов по массиву for j := 1 to N-i do // количество сравнений в каждом проходе if sum(arr[j]) > sum(arr[j+1]) then begin a := arr[j]; arr[j] := arr[j+1]; arr[j+1] := a; end;
for i := 1 to N do write(arr[i]:3); writeln; for i := 1 to N do write(sum(arr[i]):3); writeln; end.
Как получить 507 и 510? Первое число m, не меньшее некоторого k и кратное n определяется по простому алгоритму. Пусть p = k mod n - остаток от целочисленного деления k на n. Если p=0, то m=k, в противном случае m=k+n-p.
Проверим для k=500, n=13.
p = 500 mod 13 = 6. p≠0 ⇒ m = 500+13-6 = 507.
Поскольку 17>13, в последовательности чисел, кратных 17, их не может быть больше половины искомого количества, т.е. больше 20/2=10. А десятый член последовательности 510, 257, ... это 510+9×17 = 663. Тем более, это значение не может быть превышено в последовательности чисел, кратных 13, их там будет (663-507)/13=12.
Окончательно: строим последовательности из 12 чисел ряда 507, 520, 533... и 10 чисел ряда 510, 527, 544, ... объединяем их в последовательность, упорядоченную по возрастанию и берем 20 первых ее членов.
PascalABC.NET 3.3.5, сборка 1660 от 20.04.2018
Внимание! Если программа не работает, обновите версию!
begin
(SeqGen(12,507,t->t+13)+SeqGen(10,510,t->t+17)).OrderBy(t->t)
.Distinct.Take(20).Println
end.
Результат
507 510 520 527 533 544 546 559 561 572 578 585 595 598 611 612 624 629 637 646
def summ(m):
s = 0
while m > 0:
s += m % 10
m = m // 10
return s
from random import random
N = 10
a = [0] * N
for i in range(N):
a[i] = int(random() * 40) + 10
print('%4d' % a[i], end='')
print()
for i in range(N - 1): # количество переборов 9
for j in range(N - i - 1): # при первом переборе i=0
if summ(a[j]) > summ(a[j + 1]):
a[j], a[j + 1] = a[j + 1], a[j]
for i in range(N):
print('%4d' % a[i], end='')
print()
for i in range(N):
print('%4d' % summ(a[i]), end='')
print()
pascal
const
N = 10;
var
arr: array[1..N] of integer;
i, j: byte;
a: integer;
function sum (n: integer): byte;
begin
sum := 0;
while n > 0 do begin
sum := sum + n mod 10;
n := n div 10;
end;
end;
begin
randomize;
for i := 1 to N do begin
arr[i] := random(20)+10;
write (arr[i]:3);
end;
writeln;
for i := 1 to N-1 do // количество проходов по массиву
for j := 1 to N-i do // количество сравнений в каждом проходе
if sum(arr[j]) > sum(arr[j+1]) then begin
a := arr[j];
arr[j] := arr[j+1];
arr[j+1] := a;
end;
for i := 1 to N do
write(arr[i]:3);
writeln;
for i := 1 to N do
write(sum(arr[i]):3);
writeln;
end.