完数,给定三个正整数L,R,S

完数
描述

给定三个正整数L,R,S。对于一个正整数N,如果L<=N<=R,且N的所有位数之和为S

那么这个数被称为完数,现在请你找出L,R之间的所有完数上所有位数相乘结果最大的那个,请输出这个数和这个数每一位的乘积,如果有多组解,输出最小的那个S。

day14-01.zip

输入
第一行一个整数T,表示数据组数(T<=10)

其后T行,每行三个整数L,R,S;(L,R<=5*10^6),S<=100;

输出
T行:

每行两个整数,表示题目的答案,用空格隔开;

输入样例 1

1
9 100 6
输出样例 1

33 9

引用 皆我百晓生 小程序回复内容作答:

#include <iostream>
#include <vector>
using namespace std;

int digitSum(int n) {
    int sum = 0;
    while (n) {
        sum += n % 10;
        n /= 10;
    }
    return sum;
}

int productSum(int n) {
    int product = 1;
    while (n) {
        product *= n % 10;
        n /= 10;
    }
    return product;
}

int main() {
    int T;
    cin >> T;
    
    while (T--) {
        int L, R, S;
        cin >> L >> R >> S;
        
        vector<int> perfectNumbers;
        for (int i = L; i <= R; i++) {
            if (digitSum(i) == S) {
                perfectNumbers.push_back(i);
            }
        }
        
        int maxProduct = -1;
        int answer = -1;
        for (int i = 0; i < perfectNumbers.size(); i++) {
            int product = productSum(perfectNumbers[i]);
            if (product >= maxProduct) {
                maxProduct = product;
                answer = perfectNumbers[i];
            }
        }
        
        cout << answer << " " << maxProduct << endl;
    }
    
    return 0;
}
您好,我是有问必答小助手,您的问题已经有小伙伴帮您解答,感谢您对有问必答的支持与关注!
PS:问答VIP年卡 【限时加赠:IT技术图书免费领】,了解详情>>> https://vip.csdn.net/askvip?utm_source=1146287632

【以下回答由 GPT 生成】

解决方案

首先,我们需要编写一个函数is_perfect_number()来判断一个数是否是完数。完数是指其所有因子之和等于它本身的正整数。

然后,我们可以使用两个循环,从LR遍历所有的正整数,并判断它们是否是完数。对于每个完数,我们计算它的位数乘积,并记录下最大的位数乘积和对应的完数。

最后,输出最大位数乘积和对应的完数。

下面是具体的实现代码:

import math

def is_perfect_number(n):
    factors_sum = 1  # 因子和初始化为1,因为所有的数都至少有因子1
    for i in range(2, int(math.sqrt(n)) + 1):  # 只需要检查到sqrt(n)即可
        if n % i == 0:
            factors_sum += i
            if i != n // i:  # 避免重复计算因子
                factors_sum += n // i
    return factors_sum == n

T = int(input())  # 输入数据组数

for _ in range(T):
    L, R, S = map(int, input().split())  # 输入每组数据

    max_digit_product = -1
    max_perfect_number = -1

    for num in range(L, R + 1):  # 遍历从L到R的所有整数
        if is_perfect_number(num):
            digit_product = 1
            for digit in str(num):  # 计算位数乘积
                digit_product *= int(digit)
            if digit_product > max_digit_product:
                max_digit_product = digit_product
                max_perfect_number = num

    print(max_perfect_number, max_digit_product)

复杂度分析

  • 时间复杂度:每个输入数据组都需要遍历从LR的所有整数,因此总的时间复杂度为O(T * (R - L)),其中T为数据组数,R和L为输入的整数范围。
  • 空间复杂度:除了输入的变量以外,只需要常数级的额外空间,因此空间复杂度为O(1)。


【相关推荐】



如果你已经解决了该问题, 非常希望你能够分享一下解决方案, 写成博客, 将相关链接放在评论区, 以帮助更多的人 ^-^