acwing水仙花束

题目描述

春天是鲜花的季节,水仙花就是其中最迷人的代表,数学上有个水仙花数,它是这样定义的:

“水仙花数”是指一个三位数,它的各位数字的立方和等于其本身,比如:153=13+53+33153=13+53+33。

现在要求输出所有在 mm 和 nn 范围内的水仙花数。

输入格式

输入包含多组测试数据。

每组数据占一行,包含两个整数 mm 和 nn。

最后一行 0 0 表示输入结束。

输出格式

每组数据输出一行答案,从小到大输出所有位于 [m,n][m,n] 范围内的水仙花数,数之间用空格隔开,如果没有则输出 no

数据范围

100≤m≤n≤999100≤m≤n≤999,
输入最多包含 1010 组数据。

输入样例:
100 120 
300 380 
0 0
输出样例:
no
370 371

 思路:

我发现好多题都可以用倒序数那道题的思路,把一个数每个位上的数单独分离出来,然后再根据题意进行运算。真是万能啊!

小二 ~ ~上代码!

#include <iostream>
using namespace std;
int flower(int n) {
	int a, b, c;
	a=n % 10;
	b = (n / 10) % 10;
	c = (n / 100) % 10;
	if (a * a * a + b * b * b + c * c * c == n) {
		return 1;
	}
	else return 0;
}
int main() {
	int n, m, flag=0;
	while (1) {
		cin >> n >> m;
		if (n == 0 && m == 0) {
			break;
		}
		for (int i = n;i <= m;i++) {
			if (flower(i) == 1) {
				flag = 1;
				cout << i << " ";
			}
		}
		if (flag == 0) {
			cout << "no";
		}
		cout << endl;
		flag = 0;
	}
	return 0;
}

<think>好的,用户想了解如何在Java中打印水仙花。首先,我需要确认水仙花的定义。水仙花,也就是阿姆斯特朗,是指一个n位,其各位字的n次方之和等于该本身。例如,153是一个3位,1³ + 5³ + 3³ = 153,所以它是水仙花。 接下来,我需要确定用户可能需要的范围。通常,水仙花指的是3位,但有时候也可能包括其他位。比如,四位中的8208也是一个水仙花。不过,用户可能主要关注3位的情况,所以应该先处理这个范围,同时也可以说明如何扩展到更多位。 然后,考虑实现步骤。首先需要遍历指定范围内的所有,比如100到999之间的。对于每个,需要分解它的各个位上的字,计算它们的n次方之和,然后比较是否等于原。 分解字的方法可以用取模和除法。例如,对于三位153,分解百位、十位和个位。这里需要注意的是,Java中整除法会直接取整,所以可以用这个特性来获取各个位上的字。 计算n次方的时候,可以使用Math.pow()方法,但要注意返回的是double类型,需要转换为int。或者,可以自己写一个循环来计算次方,但Math.pow更方便,不过对于三位来说,3次方不会有精度问题吗?比如5³=125,没问题。但如果是更大的,可能需要考虑,但暂时先使用Math.pow。 然后,组织代码结构。主函负责遍历字,对每个判断是否是水仙花。可以写一个辅助函来判断是否是水仙花,这样代码更清晰。 需要考虑代码的效率,不过对于三位来说,计算量不大,所以直接遍历即可。如果是更大的范围,可能需要优化,但用户的需求可能不需要那么复杂。 测试方面,确保代码能正确输出153、370、371、407这几个三位水仙花。此外,可能要考虑是否需要包括一位和二位,但通常水仙花从三位开始,因为像1这样的虽然是1位,1^1=1,但可能用户不关心,所以需要明确范围。 用户可能需要代码示例,所以需要提供一个完整的Java程序,包括类定义、主方法等。代码中要注意变量命名和注释,让用户容易理解。 另外,可能需要解释一下代码的逻辑,帮助用户理解每一步的作用。比如如何分解各位字,如何计算次方之和,然后进行比较。 最后,可能扩展说明如何修改代码来查找其他位水仙花,比如四位,这样用户可以自行调整范围。同时指出不同位时,次方的次需要相应改变,比如四位需要计算四次方之和。 总结一下,回答的结构应该是:定义水仙花,给出Java代码示例,解释代码逻辑,并说明如何扩展。确保代码正确,语法无误,并且符合用户的预期。</think>### Java打印水仙花的实现方法 **水仙花(Narcissistic Number)** 是指一个n位,其各位字的n次方之和等于它本身。例如: - 三位中的水仙花:$153 = 1^3 + 5^3 + 3^3$ - 四位中的水仙花:$8208 = 8^4 + 2^4 + 0^4 + 8^4$ 以下分步骤讲解如何用Java实现水仙花的打印。 --- #### 步骤1:确定范围 通常以三位为例,范围是 **100~999**。若需其他范围,可调整代码。 #### 步骤2:分解字并计算次方和 对于每个字,分解其个位、十位、百位等,计算次方后求和。 #### 步骤3:比较结果 若次方和等于原字,则为水仙花。 --- ### 完整代码示例 ```java public class NarcissisticNumber { public static void main(String[] args) { System.out.println("三位中的水仙花:"); for (int num = 100; num <= 999; num++) { if (isNarcissistic(num)) { System.out.println(num); } } } // 判断是否为水仙花 private static boolean isNarcissistic(int num) { int original = num; int sum = 0; int digits = String.valueOf(num).length(); // 获取位n while (num > 0) { int digit = num % 10; // 取最后一位字 sum += Math.pow(digit, digits); // 计算n次方并累加 num /= 10; // 移除最后一位 } return sum == original; } } ``` --- ### 代码解释 1. **主函**:遍历100~999的每个字,调用`isNarcissistic`方法判断。 2. **isNarcissistic方法**: - 通过取余(`% 10`)和整除(`/ 10`)逐位分解字。 - 用`Math.pow()`计算每位字的n次方之和。 - 返回比较结果。 --- ### 扩展说明 1. **调整范围**:修改`for`循环的起始和终止值,可查找其他位水仙花。 ```java // 查找四位中的水仙花 for (int num = 1000; num <= 9999; num++) { // ... } ``` 2. **输出示例**: ``` 三位中的水仙花: 153 370 371 407 ``` --- ### 总结 通过分解字、计算次方和并比较结果,即可高效打印水仙花。此方法灵活支持不同位范围,适用于任意n位的场景。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值