首页 > 试题广场 >

水仙花数

[编程题]水仙花数
  • 热度指数:101679 时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 32M,其他语言64M
  • 算法知识视频讲解
春天是鲜花的季节,水仙花就是其中最迷人的代表,数学上有个水仙花数,他是这样定义的: “水仙花数”是指一个三位数,它的各位数字的立方和等于其本身,比如:153=1^3+5^3+3^3。 现在要求输出所有在m和n范围内的水仙花数。

输入描述:
输入数据有多组,每组占一行,包括两个整数m和n(100 ≤ m ≤ n ≤ 999)。


输出描述:
对于每个测试实例,要求输出所有在给定范围内的水仙花数,就是说,输出的水仙花数必须大于等于m,并且小于等于n,如果有多个,则要求从小到大排列在一行内输出,之间用一个空格隔开;
如果给定的范围内不存在水仙花数,则输出no;
每个测试实例的输出占一行。
示例1

输入

100 120
300 380

输出

no
370 371
// 简洁版代码,下面有详细解释好的(大神勿喷)
#include <stdio.h>
int main()
 {
    int m, n = 0;
    scanf("%d %d", &m, &n);
    int count = 0;
    for (int i = m; i <= n; i++)
    {
        int sum, ret = 0;
        int result = i;
        while (result > 10)
        {
            sum = result % 10;
            ret += sum * sum * sum;
            result /= 10;
        }
        if (result < 10)
        {
            ret += result * result * result;
            if (ret == i)
            {
                printf("%d ", i);
                count++;
            }
        }
    }
    if (count == 0)
    {
        printf("no\n");
    }
    return 0;
}

// 解释版(大神勿喷)
#include <stdio.h>
int main()
 {
    int m, n = 0;
    scanf("%d %d", &m, &n); // 先输入数值 m ~ n 的范围
    int count = 0;
    // 这个用来最后确认 count 数值有没有变动,如果出现符合题目的数值,count 就会++
    // 如果这个 count 最后还是 0 说明在 m ~ n 范围内没有符合 三个数立方相乘 相加 = 数值本身的数字
    for (int i = m; i <= n; i++)  // 设置 i = m 也就是最低数值, i < n 最大数值
    {
        int sum, ret = 0; // 用来存储当前数字的每个位数
        int result = i; // 用来代替 i 进入循环,摘出每个位置的数值
        while (result > 10) // 这里用 result 代替 i 这样就不会修改 i 的值
        {
            sum = result % 10; // 这里每次 % 10 都能得到当前数字的最后一个值,并赋值给 sum
            ret += sum * sum * sum; // 赋值后的 sum * 三次 赋值给 ret,就能得到每个位数最后一个的立方乘积
            result /= 10; // 再用 result / 10 ,这样可以挨个削减位数,直到数字只剩一个数,一个数 > 10,跳出
        }
        if (result < 10) // 当 result < 10 以后,就是个位数了
        {
            ret += result * result * result; // 最后把这个个位数 * 三次就得到了所有的位数 * 三次的和了
            if (ret == i) // 最后判断和是否等于当前的 i 数值,如果是,就输出,并且 count++
            {
                printf("%d ", i);
                count++; // count++只要被执行过一次,就说明至少有一个数值,就符合题目
            }
        }
    }
    if (count == 0) // 如果上面的 count++ 从未被执行,就说明没有符合题目的数值,就直接输出 no
    {
        printf("no\n");
    }
    return 0;
}
发表于 2025-06-17 20:33:30 回复(0)
#include <stdio.h>
#include <math.h>

int main() {
    int m, n;
    while (scanf("%d %d", &m, &n) != EOF) {
        int count = 0;
        for(int i=m ; i<n ;i++){
            if (pow(i/100,3)+pow((i/10)%10,3)+pow(i%10, 3)==i) {
                printf("%d ",i);
                count++;
            }
        }
        if(count==0){
            printf("no");
        }
        printf("\n");
    }
    return 0;
}
发表于 2025-02-28 22:29:18 回复(0)
#include <stdio.h>
#include <math.h>

int main() 
{
    int m, n,temp;
    while(scanf("%d %d",&m,&n) != EOF)
    {
        if(m>n)
        {
            temp = m;
            m = n;
            n = temp;
        }
        int gg = 0;
        for(int i=m;i<=n;i++)
        {
            if(pow(i/100,3) + pow((i/10)%10,3) + pow(i%10,3) == i )
            {
                printf("%d ",i);
                gg++;
            }
        }
        if(gg == 0)
        {
            printf("no");
        }
        printf("\n");

    }
   
    return 0;
}

发表于 2024-11-22 22:19:47 回复(0)
#include<stdio.h>

int main()
{
    int n,m,shui;
    while((scanf(" %d",&m)!=EOF)&&(scanf(" %d",&n)!=EOF)){
        getchar();
        int ge,shi,bai;
        for(int i=m;i>=m&&i<=n;i++){
            ge=i%10;
            shi=i/10%10;
            bai=i/100;
            if(i==(ge*ge*ge+shi*shi*shi+bai*bai*bai))
                printf("%d ",i);
        }
        if(!shui)
            printf("no");
        printf("\n");
        shui=0;
    }
    return 0;
}
发表于 2024-09-10 22:22:28 回复(0)
#include <stdio.h>
#include <math.h>
int fun_water ( int a )
{
    int x= a;
    int count = 0;
    while ( a !=0 )
    {
        a = a / 10;
        count++;
    }
    int sum = 0;
    while ( x != 0 )
    {
        int b = x % 10;
        x = x / 10;
        sum += pow(b,count);
    }
    return sum;
}

int main() {
    int m = 0, n =0;
    while((scanf("%d%d", &m, &n)) != EOF)
    {
        if( m > n )
        {
            int tmp = m;
            m = n;
            n = tmp;
        }
        int flag = 0;
        int i = m;
        for ( i = m; i <= n; i++ )
        {
            int j = fun_water ( i );
            
            if ( i == j )
            {
                flag++;
                printf("%d ", i);
            }
        }
        if ( flag == 0 )
        {
            printf("no\n");
        }
        else {
        printf("\n");
        }
    }
    return 0;
}

发表于 2024-08-03 13:31:12 回复(0)
/*思路 :2024年5月20日23:29:52
        两个整数 m n 用户输入 (并且有范围)
        判断是否是水仙花数 首先要得出个位 十位 百位 
        个位 : 取模%10 十位 :取模%100 百位 :/100
        使用 ge shi bai 来接收这几个数字
        然后判断用户输入的范围之内有没有水仙花数
 */
//错误代码 第一次思考
// # include <stdio.h>
//  int main ()

//  {
//     int m ,n;
//     // if (m>=) {
    
//     // }
//     while(scanf("%d %d",&m,&n)!=EOF)
//     {
//         for(int i=100;i<=999;i++)
//         {
//             int ge = i%10;
//             int shi = i%100;
//             int bai = i/100;
//             int sum = ge*ge*ge+shi*shi*shi+bai*bai*bai;
//             if (sum==n||sum==m) 
//             {
//                 printf("%d",sum);   
//             } 
//             else 
//             {
//                 printf("no\n");
//             }  
//         }

//     }

//     return 0;
//  }
//改进代码
// #include <stdio.h>

// int main() {
//     int m, n;
//     while (scanf("%d %d", &m, &n) != EOF) {
//         // 初始化一个标志变量,用于检查是否找到了水仙花数
//         int found = 0;
        
//         // 遍历从m到n的每一个数
//         for (int i = m; i <= n; i++) {
//             int ge = i % 10; // 个位
//             int shi = (i / 10) % 10; // 十位
//             int bai = i / 100; // 百位
            
//             // 计算各位数字的立方和
//             int sum = ge * ge * ge + shi * shi * shi + bai * bai * bai;
            
//             // 判断是否是水仙花数
//             if (sum == i) {
//                 printf("%d ", i); // 输出水仙花数
//                 found = 1; // 设置标志变量
//             }
//         }
        
//         // 如果没有找到水仙花数,则输出"no"
//         if (!found) 
//         {
//             printf("no\n");
//         }
        
//         // 每个测试用例后输出一个换行符
//     }

//     return 0;
// }
# include <stdio.h>
int main ()

{
    int m,n;
    while (scanf("%d %d",&m,&n)!=EOF) //多组输入
    {
        int found = 0;//用于判断是否找到了水仙花数
        for(int i = m;i<=n;i++)//遍历循环出m-n中所有的数字
        {
            int ge = i % 10;
            int shi = (i/10)%10;
            int bai = i /100;
            int sum = ge*ge*ge+shi*shi*shi+bai*bai*bai;//存放在sum里面
            if(sum==i)
            {
                printf("%d ",i);
                found=1;
            }
        }
/*如果 found 为 1(真),表示找到了;如果 found 为 0(假),表示没有找到。
当我们使用 !found 时,其含义如下:
如果 found 是 1(真),!found 将变为 0(假)。
如果 found 是 0(假),!found 将变为 1(真)。*/
             if (!found) 
            {
                printf("no\n");
            }
        
    }

        return 0;
}

发表于 2024-05-21 00:21:07 回复(0)
#include <stdio.h>

int main()
{
	int m, n;
	m = n = 0;
	int flag = 0;	//判断是否有水花仙数
	while (scanf("%3d %3d", &m, &n) != EOF)	//输入的范围
	{
		int i = 0;
		for (i= m; i <= n; i++)	//生成m到n的数	//157/10%10 =15%10 =5
		{
			if ((int)pow(i % 10, 3) +   //求个位
				(int)pow(i / 10 % 10, 3) +  //求十位
				(int)pow(i /100, 3) == i)	//是水花仙数的判断条件
			{
				printf("%d ", i);
				flag = flag + 1;
			}
		}
		if (flag == 0)	//没有水花仙数
			printf("no\n");
	}
	return 0;
}

发表于 2024-05-11 20:19:21 回复(0)
include <stdio.h>
#include <math.h>

int main()
{
    int  m = 0, n = 0, ret = 0, sum = 0;
    int count = 0;

    while (1)
     {
        scanf("%d %d", &m, &n);
        if (m >= 100 && n <= 999)
        {
            break;
        }
     }

    for (int i = m; i <= n; i++)
    {
        int j=i;
        sum =0;
        while (j>0)
        {
            ret = j % 10;
            sum += (int)pow(ret, 3);
            j = j / 10;
        }

        if (sum == i)
        {
            printf("%d ", sum);
            ++count;
        }
    }

    if (count == 0)
    {
        printf("no\n");
    }
   
    return 0;
}
发表于 2024-05-01 22:55:29 回复(0)
#include <math.h>
#include <stdio.h>

int main() {
    int m, n, a, b, c;
    int t = 0;
    while (scanf("%d %d", &m, &n) != EOF) {

        for (int i = m; i <= n; i++) {
            a = i / 100;
            b = i / 10 % 10;
            c = i % 10;
            if (pow(a, 3) + pow(b, 3) + pow(c, 3) == i) {
                printf("%d ", i);
                t++;
            }

        }
        if (t == 0) {
            printf("no\n");
        }
    }

    return 0;
}

发表于 2024-02-19 23:05:01 回复(0)
#include <stdio.h>

int main() {
    int m,n=0;
    int a,b,c=0;
    while (scanf("%d %d", &m, &n) != EOF) {
        int flag=0;
        for(int i=m;i<=n;i++){
            a=i/100;
            b=i%100/10;
            c=i%10;
            if(i==(a*a*a+b*b*b+c*c*c)){
                printf("%d ",i);
                flag++;            }
        }
        if(flag==0){
            printf("no\n");
        }
        else{
            printf("\n");
        }
    }
    return 0;
}

编辑于 2024-02-07 09:13:30 回复(0)
#include <stdio.h>
#include <math.h>

int main() {
    int m, n, i;
    int sum = 0;
    int arr[100] = {0};
    while (scanf("%d %d", &m, &n) != EOF) {
        for (i = m; i <= n; i++) {
            int j = i, sum1 = 0;
            while (j > 0) {
                sum1 = sum1 + pow(j % 10, 3);
                j = j / 10;
            }
            if (i == sum1) {
                arr[sum] = i;
                sum++;
            }
        }
        if (sum == 0) {
            printf("no\n");
        } else {
            for (i = 0; i < sum; i++) {
                printf("%d ", arr[i]);
            }
            printf("\n");
        }

    }

    return 0;
}
发表于 2024-02-04 15:42:15 回复(0)
#include <stdio.h>
#include <math.h>

int main() {
    int m, n, a[3], tag = 0;
    while (scanf("%d %d", &m, &n) != EOF) {
        for (int i = m; i <= n; i++) {
            a[2] = i % 10;
            a[1] = (i / 10) % 10;
            a[0] = (i / 100) % 10;
            if (pow(a[0], 3) + pow(a[1], 3) + pow(a[2], 3) == i) {
                printf("%d ", i);
                tag++;
            }
        }
        if (tag == 0) {
            printf("no");
        }
        printf("\n");
    }
    return 0;
}

发表于 2024-01-21 10:43:44 回复(0)
int  Narcissus(int tmp, int b)
{
    int m = tmp;
    int sum = 0;
    int s = 0;
    while (tmp != 0)
    {
        sum += pow(tmp % 10, 3);
        tmp /= 10;

    }
    if (sum == m)
    {
        return 1;
    }
    else
    {
        return 0;
    }

}
int main()
{
    int m = 0;
    int n = 0;
    int tmp = 0;
    int i;
    int f = 0;
    int s = 0;//标记已经有水仙花数
    while (scanf("%d %d", &m, &n) != EOF)
    {
        for (tmp = m; tmp <= n; tmp++)
        {
            f = 0;
            i = Narcissus( tmp , 3);
            if (i == 1)
            {
                s = 1;
                printf("%d ", tmp);
            }
            else
            {
                f = 1;
                
            }
        }
        if (f == 1 && s != 1)
        {
            printf("no\n");
        }
    }
    return 0;
}

编辑于 2023-12-28 21:36:43 回复(0)
#include <stdio.h>

int main() {
    int m = 0, n = 0, a = 0, b = 0,c = 0, i = 0, j = 0;
    while (scanf("%d %d", &m, &n) != EOF) 
	{
		for(i = m; i < n+1; i++)
		{
			a = i % 10;        //个位
			b = i % 100 / 10;  //十位
			c = i % 1000 / 100; //百位
			if (i == a * a * a + b * b * b + c * c * c )
			{
				printf("%d ", i);
				j++;
			}
		}
		if(j == 0)
		{
			printf("no");
		}
    }
    return 0;
}

发表于 2023-11-28 22:08:17 回复(0)
#include <stdio.h>
int main()
{
    int m,n,a,b,c,sum;
    while(scanf("%d %d",&m,&n))
    {
            int i;
    int flag = 1;
    for(i=m;i<=n;i++)
    {
        int j = i;
        a = j%10;
        b = (j/10)%10;
        c = (j/100);
        sum = a*a*a+b*b*b+c*c*c;
        if(sum == i)
        {
            printf("%d ",i);
            flag = 0;
        }
    }
    if(flag == 0)
    {
        printf("\n");
    }
    if(flag)
    {
        printf("no\n");
    }   
    return 0;
}
}

发表于 2023-11-02 09:15:29 回复(0)
#include <stdio.h>
#include <math.h>

int main()
{
    int m = 0;
    int n = 0;
    while (scanf("%d %d", &m, &n) == 2)
    {
        int i = 0;
        int j = 0;
        int a = 0;
        int arr[100] = {0};
        int count = 0;
        for (i = m;i <= n;i++)
        {
            int sum = 0;
            a = i;
            for (j = 0;;j++)
            {
                arr[j] = a % 10;
                a /= 10;
                sum += pow(arr[j], 3);
                if (a == 0)
                    break;
            }
            if (sum == i)
            {
                count++;
                printf("%d ", i);
            }
        }
        if (count == 0)
            printf("no\n");
        else
            printf("\n");
    }
    return 0;
}
发表于 2023-10-09 20:41:16 回复(0)
#include <stdio.h>
#include <math.h>
int main() 
{
   int m = 0;
   int n = 0;
    while (scanf("%d %d", &m, &n) != EOF) 
    { 
     int mid = 0;
     int count = 0;
     for(mid = m; mid <= n; mid++)
     {
       if(mid == pow(mid / 100,3) + pow(mid % 100 / 10,3) + pow(mid % 10,3) )
         {
            printf("%d ",mid);
            count++;
         }
     }
     if(0==count)
     { 
        printf("no\n");
     }
    }
    return 0;
}

发表于 2023-07-13 17:53:47 回复(0)
#include <stdio.h>
int main() {
    int m = 0, n = 0;
    int ge = 0, shi = 0, bai = 0, flag = 0;
    int i = 0;
    while (scanf("%d %d\n", &m, &n) != EOF) 
    { 
       for(i = m; i <= n; i++)
       {
            ge = i % 10;
            shi = i / 10 % 10;
            bai = i / 100;
            if( i == ge * ge * ge + shi * shi * shi + bai * bai * bai)
            {
                printf("%d ",i);
                flag = 1;
            }

           
       }
       if(flag == 0)
       printf("no\n");
    }

    return 0;
}

发表于 2023-06-29 10:40:48 回复(0)
#include <stdio.h>
int main() {
    int m, n,count=0; //题目要求输出结果是具体的水仙花数字,并且没有时要输出no,故定义count用来防备范围内无数字的情况
    while(~scanf("%d %d",&m,&n)){//输入输出均为变量,须双循环套娃操作,这俩配合作战效果奇佳
        for(m;m<=n;m++){//未引入数学函数,懒得声明,所以if这里又臭又长。意思是分别取三位数的位数进行计算
            if(((m/10%10)*(m/10%10)*(m/10%10))+((m%10)*(m%10)*(m%10))+((m/100)*(m/100)*(m/100))==m) {
                printf("%d ",m);//小心这里,因为水仙花数可能不止一个,%d后面要空格哦
                count++;//当count始终为0时,出循环后即可输出no
            }
        }
        if(!count){// !count相当于count==0
            printf("no");
            printf("\n");
        } 
    }
    return 0;
}

发表于 2023-06-20 11:14:04 回复(0)
#include <stdio.h>
#include<math.h>
int main()
{
    int a=0;
    int b=0;
    int count=0;
    while(scanf("%d %d",&a,&b)!=EOF)
    {
        for(int i=a;i<=b;i++)
        {
            int tmp=i;
            int sum=0;
            int n=1;
            while(tmp/10)
            {
                n+=1;
                tmp/=10;
            }
            tmp=i;
            while(tmp)
            {
                sum+=pow(tmp%10,n);
                tmp/=10;
            }
            if(sum==i)
            {
                count++;
                printf("%d ",i);
            }
        }
        if(count==0)
        {
            printf("no\n");
        }
    }
    return 0;
}
发表于 2023-05-29 14:27:27 回复(0)