机考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
#牛客创作赏金赛#

主要记录自己的刷题日常,学而时习之。

全部评论

相关推荐

02-07 12:06
已编辑
华侨大学 测试开发
最近看到很多&nbsp;92&nbsp;的,甚至是硕士,开始往测开赛道卷,说实话有点看不懂。先把话说清楚,大厂里的测开,绝大多数时间干的还是测试的活,只是写点自动化脚本、维护测试平台、接接流水线,真正像开发一样做系统、做架构、做核心平台的测开少得可怜,基本都集中在核心提效组,而且人很少,外面进去的大概率轮不到你,我想真正干过人都清楚。很多人被洗脑了,以为测开也是开,和后端差不多,只是更简单、更轻松、还高薪。现实情况是,测开和开发的职业路径完全不一样。开发的核心是业务和系统能力,测开的核心是稳定性和覆盖率,前者是往上走,后者天花板非常明显。你可以见到很多开发转测开,但你很少见到干了几年测开还能顺利转回开发的。更现实一点说,92&nbsp;的高学历如果拿来做测开,大部分时间就是在做重复性很强的杂活,这种工作对个人能力的放大效应非常弱。三年下来,你和一个双非的,甚至本科的测开差距不会太大,但你和同龄的后端、平台开发差距会非常明显。这不是努不努力的问题,是赛道问题。所谓测开简单高薪,本质上是把极少数核心测开的上限,当成了整个岗位的常态来宣传。那些工资高、技术强的测开,本身就是开发水平,只是挂了个测开的名。普通人进去,99%&nbsp;做的都是项目兜底型工作,而不是你想象中的平台开发。测开不是不能做,但它绝对不是开发的平替,也不是性价比最优解。如果你是真的不想做开发,追求稳定,那测开没问题。但如果你只是觉得测开比后端容易,还能进大厂,那我劝你冷静一点,这只是在用短期安全感换长期天花板。有92的学历,如果你连测开这些重复性工作都能心甘情愿接受,那你把时间精力用在真正的开发、系统、业务深度上,回报大概率比卷测开要高得多。想清楚再下场,别被岗位名和话术带偏了,就算去个前端客户端也是随便占坑的,测开是一个坑位很少赛道,反而大面积学历下放,不用想也能知道会是什么结果,我想各位在JAVA那里已经看到了
小浪_Coding:工作只是谋生的手段 而不是相互比较和歧视
点赞 评论 收藏
分享
01-28 16:12
中南大学 Java
几年前还没有chatgpt的时候,刷题真的是很痛苦。刷不出来只能看题解,题解有几个问题:第一个是每次看的写题解的人都不一样,很难有一个统一的思路;第二个也是最重要的是,题解只提供了作者自己的思路,但是没有办法告诉你你的思路哪里错了。其实很少有错误的思路,我只是需要被引导到正确的思路上面去。所以传统题解学习起来非常困难,每次做不出来难受,找题解更难受。但是现在chatgpt能做很多!它可以这样帮助你&nbsp;-1.&nbsp;可以直接按照你喜欢的语言生成各种解法的题解和分析复杂度。2.&nbsp;把题和你写的代码都发给它,它可以告诉你&nbsp;你的思路到底哪里有问题。有时候我发现我和题解非常接近,只是有一点点🤏想错了。只要改这一点点就是最优解。信心倍增。3.&nbsp;如果遇到不懂的题解可以一行一行询问为什么要这样写,chatgpt不会嫌你烦。有时候我觉得自己的range写错了,其实那样写也没错,只是chat老师的题解有一点优化,这个它都会讲清楚。4.&nbsp;它可以帮你找可以用同类型解法来做的题。然后它可以保持解法思路不变,用一个思路爽刷一个类型的题。如果题目之间思路又有变化,它会告诉你只有哪里变了,其他的地方还是老思路。5.&nbsp;它也可以直接帮你总结模板,易错点。经过chat老师的指导,我最大的改变是敢刷题了。之前刷题需要先找某一个人写的算法题repo,然后跟着某一个人他的思路刷他给的几个题。如果想写别的题,套用思路失败了,没有他的题解,也不知道到底哪里错了;看别人的题解,思路又乱了。这个问题在二分查找和dp类型的题里面特别常见。但是现在有chat老师,他会针对我的代码告诉我我哪里想错了,应该怎么做;还按照我写代码的习惯帮我总结了一套属于我的刷题模板。每天写题全是正反馈!
明天不下雨了:那我建议可以用 chatgpt atlas 或者 dia 去刷,也可以用 chrome 加个 ai 插件去刷 左边刷题右边 chat 效果很好
AI时代的工作 VS 传...
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务