📅  最后修改于: 2023-12-03 14:51:02.915000             🧑  作者: Mango
给定一个正整数 n,找到 n 的所有因数中数字总和最大的数。
对于一个正整数 n,其所有因数可以分为两部分:小于等于 $\sqrt{n}$ 的因数和大于 $\sqrt{n}$ 的因数。对于小于等于 $\sqrt{n}$ 的因数,可以直接枚举,求出其中数字总和最大的数;对于大于 $\sqrt{n}$ 的因数,可以通过 $\frac{n}{d}$ 求得,再求其字数总和即可。
import math
def get_divisors(n):
divisors = []
for i in range(1, int(math.sqrt(n))+1):
if n % i == 0:
divisors.append(i)
if i != n // i:
divisors.append(n // i)
return divisors
def get_digits_sum(n):
digits_sum = 0
while n > 0:
digits_sum += n % 10
n //= 10
return digits_sum
def get_max_digits_sum_divisor(n):
divisors = get_divisors(n)
max_digits_sum = 0
max_digits_sum_divisor = 1
for divisor in divisors:
digits_sum = get_digits_sum(divisor)
if digits_sum > max_digits_sum:
max_digits_sum = digits_sum
max_digits_sum_divisor = divisor
for divisor in reversed(divisors):
if divisor <= math.sqrt(n):
break
quotient = n // divisor
digits_sum = get_digits_sum(quotient)
if digits_sum > max_digits_sum:
max_digits_sum = digits_sum
max_digits_sum_divisor = quotient
return max_digits_sum_divisor
assert get_max_digits_sum_divisor(12) == 6
assert get_max_digits_sum_divisor(36) == 18
assert get_max_digits_sum_divisor(100) == 25