机考E卷100分题 - 水仙花数 Ⅰ
题目描述
所谓水仙花数,是指一个n位的正整数,其各位数字的n次方和等于该数本身。
例如153是水仙花数,153是一个3位数,并且153 = 1^3 + 5^3 + 3^3。
输入描述
第一行输入一个整数n,表示一个n位的正整数。n在3到7之间,包含3和7。
第二行输入一个正整数m,表示需要返回第m个水仙花数。
输出描述
返回长度是n的第m个水仙花数。个数从0开始编号。
若m大于水仙花数的个数,返回最后一个水仙花数和m的乘积。
若输入不合法,返回-1。
示例1
输入
3
0
12
输出
153
1
说明
153是第一个水仙花数
示例2
输入
9
1
12
输出
-1
1
说明
9超出范围
解题思路
Java
import java.util.*;
public class Main {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
// 输入n和m
int n = sc.nextInt();
int m = sc.nextInt();
// 判断输入是否合法
if (n < 3 || n > 7) {
System.out.println("-1");
return;
}
// 计算水仙花数的范围
int start = (int) Math.pow(10, n - 1);
int end = (int) Math.pow(10, n);
// 存储水仙花数的列表
List<Integer> narcissusList = new ArrayList<>();
// 遍历范围内的数,判断是否为水仙花数并加入列表
for (int i = start; i < end; i++) {
if (isNarcissusNumber(i, n)) {
narcissusList.add(i);
}
}
// 获取水仙花数列表的长度
int size = narcissusList.size();
// 若列表为空,输出-1
if (size == 0) {
System.out.println("-1");
return;
}
// 输出第m个水仙花数,若m大于列表长度,则输出最后一个水仙花数乘以m
System.out.println(m >= size ? narcissusList.get(size - 1) : narcissusList.get(m));
}
// 判断一个数是否为水仙花数
public static boolean isNarcissusNumber(int num, int n) {
int sum = 0;
String numStr = String.valueOf(num);
// 计算各位数字的n次方和
for (int i = 0; i < n; i++) {
sum += Math.pow(Integer.parseInt(numStr.substring(i, i + 1)), n);
}
// 判断是否为水仙花数
return sum == num;
}
}
12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758
Python
def isNarcissusNumber(num, n):
sum = 0
numStr = str(num)
for i in range(n):
sum += int(numStr[i]) ** n
return sum == num
n = int(input())
m = int(input())
if n < 3 or n > 7:
print("-1")
exit()
start = 10 ** (n - 1)
end = 10 ** n
narcissusList = []
for i in range(start, end):
if isNarcissusNumber(i, n):
narcissusList.append(i)
size = len(narcissusList)
if size == 0:
print("-1")
exit()
print(narcissusList[size - 1] if m >= size else narcissusList[m])
1234567891011121314151617181920212223242526272829303132333435
JavaScript
const readline = require('readline');
const rl = readline.createInterface({
input: process.stdin,
output: process.stdout
});
rl.on('line', (n) => {
rl.on('line', (m) => {
n= parseInt(n);
m= parseInt(m);
// 判断输入是否合法
if (n < 3 || n > 7) {
console.log("-1");
rl.close();
return;
}
// 计算水仙花数的范围
const start = Math.pow(10, n - 1);
const end = Math.pow(10, n);
// 存储水仙花数的列表
const narcissusList = [];
// 遍历范围内的数,判断是否为水仙花数并加入列表
for (let i = start; i < end; i++) {
if (isNarcissusNumber(i, n)) {
narcissusList.push(i);
}
}
// 获取水仙花数列表的长度
const size = narcissusList.length;
// 若列表为空,输出-1
if (size === 0) {
console.log("-1");
rl.close();
return;
}
// 输出第m个水仙花数,若m大于列表长度,则输出最后一个水仙花数乘以m
console.log(m >= size ? narcissusList[size - 1] : narcissusList[m]);
rl.close();
});
});
// 判断一个数是否为水仙花数
function isNarcissusNumber(num, n) {
let sum = 0;
const numStr = String(num);
// 计算各位数字的n次方和
for (let i = 0; i < n; i++) {
sum += Math.pow(parseInt(numStr.substring(i, i + 1)), n);
}
// 判断是否为水仙花数
return sum === num;
}
12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364
C++
#include <iostream>
#include <vector>
#include <cmath>
using namespace std;
bool isNarcissusNumber(int num, int n) {
int sum = 0;
string numStr = to_string(num);
for (int i = 0; i < n; i++) {
sum += pow(stoi(numStr.substr(i, 1)), n);
}
return sum == num;
}
int main() {
int n, m;
cin >> n >> m;
if (n < 3 || n > 7) {
cout << "-1" << endl;
return 0;
}
int start = pow(10, n - 1);
int end = pow(10, n);
vector<int> narcissusList;
for (int i = start; i < end; i++) {
if (isNarcissusNumber(i, n)) {
narcissusList.push_back(i);
}
}
int size = narcissusList.size();
if (size == 0) {
cout << "-1" << endl;
return 0;
}
cout << (m >= size ? narcissusList[size - 1] : narcissusList[m]) << endl;
return 0;
}
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748
C语言
#include <stdio.h>
#include <math.h>
#include <stdlib.h>
// 判断一个数是否为水仙花数的函数声明
int isNarcissusNumber(int num, int n);
int main() {
int n, m;
// 输入n和m
if (scanf("%d %d", &n, &m) != 2) {
printf("-1\n");
return -1;
}
// 判断输入是否合法,n必须在3到7之间
if (n < 3 || n > 7) {
printf("-1\n");
return -1;
}
// 计算n位数的范围
int start = pow(10, n - 1); // n位数的起始值,例如3位数从100开始
int end = pow(10, n); // n位数的结束值,例如3位数到999结束
// 存储水仙花数的数组,最大长度为end - start
int narcissusList[end - start];
int count = 0; // 用于记录找到的水仙花数数量
// 遍历范围内的数,判断是否为水仙花数
for (int i = start; i < end; i++) {
if (isNarcissusNumber(i, n)) {
narcissusList[count++] = i; // 将水仙花数加入数组
}
}
// 若没有找到任何水仙花数,输出-1
if (count == 0) {
printf("-1\n");
return 0;
}
// 判断m的值是否超出找到的水仙花数的数量
if (m >= count) {
// m大于或等于水仙花数的数量时,返回最后一个水仙花数乘以m
printf("%ld\n", narcissusList[count - 1] * m);
} else {
// 否则,返回第m个水仙花数
printf("%ld\n", narcissusList[m]);
}
return 0;
}
// 判断一个数是否为水仙花数
int isNarcissusNumber(int num, int n) {
int sum = 0; // 用于存储各位数字的n次方和
int original_num = num; // 保留原始数值用于最后比较
// 逐位提取数字并计算n次方和
while (num > 0) {
int digit = num % 10; // 获取当前数的最后一位数字
sum += pow(digit, n); // 计算该数字的n次方并加到总和中
num /= 10; // 移除最后一位数字,继续处理剩下的数字
}
// 若n次方和等于原始数值,则该数为水仙花数
return sum == original_num;
}
12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970
#牛客创作赏金赛#大厂原题(全网最全,持续更新) 文章被收录于专栏
主要记录自己的刷题日常,学而时习之。