找出三位整数中所有的水仙花数

水仙花数Java实现
本文介绍了一段Java代码,用于找出所有三位数范围内的水仙花数,并提供了完整的程序示例及运行结果。

/**
 * 问题:
 * 打印出所有的 "水仙花数",所谓 "水仙花数"是指一个三位数,其各位数字
 * 立方和等于该数本身。例如:153是一个"水仙花数 ",因为153=1的三次方
 * +5的三次方+3的三次方。
 *
 * 程序如下:
 *
 * @author Administrator
 */
public class Daffodils {
    public static void main(String args[]){
        Daffodils d=new Daffodils();
        for(int i=100;i<1000;i++){
            if(d.isDaffodils(i)){
                System.out.println(i);
            }
        }
    }
   
    public boolean isDaffodils(int a){
        boolean b;
        int x=a/100;
        int y=a%100/10;
        int z=a%10;
        if(x*x*x+y*y*y+z*z*z==a){
            b=true;
        }
        else{
            b=false;
        }
        return b;
    }
   
}

 

运行结果:

 

run:
153
370
371
407
成功生成(总时间:0 秒)


<think> 我们参考用户提供的引用内容,用户需要的是在PTA平台上用C语言找出三位水仙花的实现方法。 根据引用[1][2][3][4]中的信息,三位水仙花的定义是:一个三位,其各位字的立方和等于该本身。 例如:153 = 1^3 + 5^3 + 3^3 = 1 + 125 + 27 = 153 题目要: 输入格式:在一行中给出两个正整数M和N(100≤M≤N≤999)。如果输入不符合这个条件(如M小于100,N大于999,或者M>N),则输出"Invalid Value."。 输出格式:顺序输出M和N区间内的所有三位水仙花,每行一个。若区间内没有水仙花,则不输出任何内容。 实现思路: 1. 读取输入的两个整数M和N。 2. 检查输入是否满足:100<=M<=N<=999。如果不满足,输出"Invalid Value."并结束程序。 3. 如果满足,则遍历区间[M, N]中的每一个整数i: - 将i分解为百位、十位和个位。例如:i=153,则百位为1,十位为5,个位为3。 - 计算百位、十位、个位的立方和。 - 如果立方和等于i,则输出i。 注意:由于题目要区间是闭区间,所以包括M和N。 分解整数的方法: - 百位 = i / 100 (整数除法) - 十位 = (i / 10) % 10 或 i % 100 / 10 - 个位 = i % 10 计算立方可以使用math.h中的pow函,也可以直接相乘(如a*a*a)。 但是注意,使用pow函时,由于它返回的是double类型,在比较整数时,我们需要注意浮点的精度问题。为了避免这个问题,我们可以使用整数运算(即直接相乘)或者对pow的结果进行四舍五入取整。但题目中要的是整数,且三位的立方都是整数,所以用pow然后取整也是可行的。不过更简单的是直接相乘。 参考引用中的代码,我们有两种方式: 引用[1]中使用了(int)pow(n,3)的方式,并进行了强制类型转换。 引用[2]和[3]则使用了pow函(没有强制转换,但比较时是整数比较,所以可能会因为浮点精度产生问题?)或者使用乘法。 为了避免浮点精度问题,建议使用整数乘法。 因此,我们采用: int a = i / 100; // 百位 int b = i / 10 % 10; // 十位 int c = i % 10; // 个位 if (a*a*a + b*b*b + c*c*c == i) { printf("%d\n", i); } 根据题目要,如果区间内没有水仙花,则无输出。 另外,注意输入范围判断:M和N必须是100到999之间的整数,且M<=N。如果不符合,则输出"Invalid Value."(注意:引用中输出的是"Invalid Value.",包括最后的句点,且第一个字母大写,后面的字母小写,注意不要写错)。 我们编写代码: 注意:输入可能有空格分隔,所以使用scanf("%d %d", &M, &N);即可。 参考引用[3]的输入样例3:990 101,此时M=990, N=101,因为M>N,所以输出Invalid Value. 代码结构: 1. 读入M, N 2. 判断条件:若M>=100且N<=999且M<=N?如果满足,则遍历区间,否则输出Invalid Value.并结束。 但是注意题目要:100≤M≤N≤999。所以条件应该写为: if (M < 100 || N > 999 || M > N) { printf("Invalid Value."); return 0; } 但是注意,题目要是100≤M≤N≤999,所以M>=100, N<=999, 且M<=N。所以条件可以写为: if (M < 100 || N > 999 || M > N) 或者 if (!(M>=100 && N<=999 && M<=N)) 我们采用第一种。 注意:题目要输出"Invalid Value."(注意有句点) 编写代码: </think> # PTA平台上用C语言找出三位水仙花的实现方法 三位水仙花是指一个三位,其各位字的立方和等于该本身。例如:$153 = 1^3 + 5^3 + 3^3 = 1 + 125 + 27 = 153$。 ## 完整C语言实现代码 ```c #include <stdio.h> #include <math.h> // 用于pow函计算立方 int main() { int m, n; scanf("%d %d", &m, &n); // 读取输入的两个整数 // 验证输入的有效性 if (m < 100 || n > 999 || m > n) { printf("Invalid Value."); return 0; } int found = 0; // 标记是否找到水仙花 // 遍历m到n之间的所有三位 for (int i = m; i <= n; i++) { int a = i % 10; // 个位 int b = (i / 10) % 10; // 十位 int c = i / 100; // 百位 // 检查是否为水仙花 if (pow(a, 3) + pow(b, 3) + pow(c, 3) == i) { printf("%d\n", i); // 输出水仙花 found = 1; // 标记已找到 } } // 如果未找到任何水仙花,则不输出任何内容 return 0; } ``` ## 代码说明 1. **输入处理**: - 使用`scanf`读取两个整数M和N - 输入格式要:`100 ≤ M ≤ N ≤ 999` 2. **有效性验证**: ```c if (m < 100 || n > 999 || m > n) { printf("Invalid Value."); return 0; } ``` - 检查M是否小于100 - 检查N是否大于999 - 检查M是否大于N - 如果任一条件不满足,输出"Invalid Value."并结束程序 3. **字分解**: ```c int a = i % 10; // 获取个位 int b = (i / 10) % 10; // 获取十位 int c = i / 100; // 获取百位 ``` - 使用取模运算和整数除法分离各位字 4. **水仙花判断**: ```c if (pow(a, 3) + pow(b, 3) + pow(c, 3) == i) ``` - 使用`pow`函计算各位字的立方和 - 比较立方和与原值是否相等 5. **输出控制**: - 每行输出一个水仙花 - 如果区间内没有水仙花,不输出任何内容 ## 测试样例验证 | 输入 | 预期输出 | 说明 | |------------|----------------|-----------------------------------| | `100 400` | `153\n370\n371`| 区间内包含三个水仙花 | | `500 600` | 无输出 | 区间内无水仙花 | | `990 101` | `Invalid Value.`| M>N,不符合输入要 | | `99 999` | `Invalid Value.`| M<100,不符合输入要 | | `100 1000` | `Invalid Value.`| N>999,不符合输入要 | | `400 500` | `407` | 区间内包含一个水仙花 | ## 优化建议 1. **避免浮点运算**: 使用整数乘法替代`pow`函,避免浮点精度问题: ```c if (a*a*a + b*b*b + c*c*c == i) ``` 2. **边界值处理**: 明确边界包含关系: ```c if (m >= 100 && n <= 999 && m <= n) ``` 3. **性能优化**: 由于三位水仙花只有4个(153, 370, 371, 407),可以直接检查这些是否在区间内: ```c int narcissistic[] = {153, 370, 371, 407}; for (int i = 0; i < 4; i++) { if (narcissistic[i] >= m && narcissistic[i] <= n) { printf("%d\n", narcissistic[i]); } } ``` ## 常见问题解答 **Q1: 为什么使用`pow`函计算立方?** A1: `pow`函可以方便计算幂运算,但需要注意浮点精度问题。对于整数立方运算,直接使用乘法(`a*a*a`)更安全。 **Q2: 如果输入值不是整数怎么办?** A2: 题目要输入正整数,如果输入非整数,`scanf`可能无法正确读取,程序行为未定义。可以添加输入验证: ```c if (scanf("%d %d", &m, &n) != 2) { printf("Invalid input."); return 0; } ``` **Q3: 如何扩展程序到更多位?** A3: 对于n位水仙花,需要: 1. 计算字位 2. 分离每位字 3. 计算每位字的n次方和 4. 比较和与原值是否相等
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值