E-水仙花数(100p)
刷题笔记合集🔗
水仙花数
问题描述
水仙花数是指一个 n 位的正整数,其各位数字的 n 次方和等于该数本身。例如,153 是水仙花数,因为 153 是一个 3 位数,并且 。
输入格式
第一行输入一个整数 ,表示一个 n 位的正整数。 在 3 到 7 之间,包含 3 和 7。
第二行输入一个整数 ,表示需要返回第 m 个水仙花数。
输出格式
返回长度是 n 的第 m 个水仙花数。个数从 0 开始编号。
若 大于水仙花数的个数,返回最后一个水仙花数和 的乘积。
若输入不合法,返回 -1。
样例输入
3
0
样例输出
153
样例解释
样例1 | 153 是第一个水仙花数。 |
样例2 | 输入 n 为 9,超出范围。 |
数据范围
题解
枚举
- 输入验证:首先检查输入的有效性,确保 在 [3, 7] 范围内。
- 生成水仙花数:根据给定的位数 ,遍历所有可能的 n 位数字(从 到 ),计算每个数字的各位数字的 n 次方和。
- 存储结果:将符合条件的水仙花数存储在列表中。
- 返回结果:
- 如果找到的水仙花数数量大于 ,则返回第 m 个。
- 如果数量不足,返回最后一个水仙花数与 的乘积。
- 如果输入无效,则返回 -1。
参考代码
- Python
def is_narcissistic(num, n):
"""判断一个数字是否为水仙花数"""
return sum(int(digit) ** n for digit in str(num)) == num
def find_narcissistic_numbers(n):
"""找到所有 n 位的水仙花数"""
lower_bound = 10 ** (n - 1)
upper_bound = 10 ** n
narcissistic_numbers = []
for num in range(lower_bound, upper_bound):
if is_narcissistic(num, n):
narcissistic_numbers.append(num)
return narcissistic_numbers
def main():
# 输入处理
try:
n = int(input().strip())
m = int(input().strip())
if not (3 <= n <= 7):
print(-1)
return
narcissistic_numbers = find_narcissistic_numbers(n)
if m < len(narcissistic_numbers):
print(narcissistic_numbers[m])
else:
last_number = narcissistic_numbers[-1] if narcissistic_numbers else -1
print(last_number * m)
except ValueError:
print(-1)
if __name__ == "__main__":
main()
- C
#include <stdio.h>
#include <math.h>
int is_narcissistic(int num, int n) {
int sum = 0, original = num;
while (num > 0) {
int digit = num % 10;
sum += pow(digit, n);
num /= 10;
}
return sum == original;
}
void find_narcissistic_numbers(int n, int *result, int *count) {
int lower_bound = pow(10, n - 1);
int upper_bound = pow(10, n);
for (int num = lower_bound; num < upper_bound; num++) {
if (is_narcissistic(num, n)) {
result[(*
剩余60%内容,订阅专栏后可继续查看/也可单篇购买
算法刷题笔记 文章被收录于专栏
本专栏收集并整理了一些刷题笔记