完数
描述
给定三个正整数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;
}
您好,我是有问必答小助手,您的问题已经有小伙伴帮您解答,感谢您对有问必答的支持与关注!【以下回答由 GPT 生成】
首先,我们需要编写一个函数is_perfect_number()
来判断一个数是否是完数。完数是指其所有因子之和等于它本身的正整数。
然后,我们可以使用两个循环,从L
到R
遍历所有的正整数,并判断它们是否是完数。对于每个完数,我们计算它的位数乘积,并记录下最大的位数乘积和对应的完数。
最后,输出最大位数乘积和对应的完数。
下面是具体的实现代码:
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)
L
到R
的所有整数,因此总的时间复杂度为O(T * (R - L)),其中T为数据组数,R和L为输入的整数范围。【相关推荐】