Найти НОД с наибольшей суммой цифр - Turbo Pascal
Формулировка задачи:
Думаю условие понятное, можно только пояснить на примере.
НОД чисел 220 и 440 это 220, а с наибольшей суммой цифр 55.
и еще (1<=a,b<=10^9)
Достаточно будет алгоритма, думаю с кодом проблем особых не будет.
Решение задачи: «Найти НОД с наибольшей суммой цифр»
textual
Листинг программы
function gcd(const a, b: LongInt): LongInt; begin if b = 0 then gcd := a else gcd := gcd(b, a mod b); end; function sum_dig(num: LongInt): LongInt; var sum: LongInt; begin sum := 0; while num > 0 do begin sum := sum + num mod 10; num := num div 10; end; sum_dig := sum; end; var a, b, g, i, ans, max_sum, sum: LongInt; begin Readln(a, b); max_sum := 0; g := gcd(a, b); for i := 1 to Round(sqrt(g)) do if g mod i = 0 then begin sum := sum_dig(i); if sum > max_sum then begin max_sum := sum; ans := i; end; sum := sum_dig(g div i); if sum > max_sum then begin max_sum := sum; ans := g div i; end; end; Writeln(ans); end.
Объяснение кода листинга программы
- Создается функция
gcd, которая принимает два аргумента типаLongIntи возвращает наибольший общий делитель этих двух чисел. Алгоритм Евклида используется для нахождения НОДа. - Создается функция
sum_dig, которая принимает один аргумент типаLongIntи возвращает сумму цифр этого числа. Функция использует циклwhileдля сложения цифр числа последовательно. - Создается переменная
aиbдля хранения введенных пользователем чисел. - Вызывается функция
gcdс аргументамиaиbи сохраняется результат в переменнойg. - Инициализируется переменная
max_sumзначением 0. - Запускается цикл
for, который выполняется от 1 до округленного значения квадратного корня изg. - В каждой итерации цикла проверяется, делится ли
gна текущее значениеiбез остатка. Если да, то вызывается функцияsum_digс аргументомi, и если сумма цифр большеmax_sum, то обновляется значениеmax_sumиansустанавливается равнымi. - После завершения цикла, значение
max_sumбудет содержать наибольший общий делитель, а значениеansбудет содержать соответствующий делитель. - Выводится значение
ans.