📜  在 n 的所有除数中找到最大的数字总和(1)

📅  最后修改于: 2023-12-03 14:51:02.915000             🧑  作者: Mango

在 n 的所有除数中找到最大的数字总和

问题描述

给定一个正整数 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