输出水仙花数,自幂数(求一个数的位数)

1.自幂数

  • 了解水仙花数之前,我们先了解自幂数:

自幂数是指一个 n 位数,它的每个位上的数字的 n 次幂之和等于它本身。
例如:
当n为3时, 有1^3 + 5^3 + 3^3 =153 , 153即是n为3时的一个自幂数;
当n=1634时;有1^4 +6^4+ 3^4+ 4^4=1634,说明1634时n=4时的一个自幂数。

1.1. 水仙花数

     水仙花数只是自幂数的一种,严格来说3位数的3次幂数才称为水仙花数。(也就是说当n=3时的自幂数为水仙花数)。
     水仙花数(Narcissistic number)也被称为超完全数字不变数、自恋数、自幂数、阿姆斯壮数或阿姆斯特朗数,
水仙花数是指一个 3 位数,它的每个位上的数字的 3次幂之和等于它本身(例如:1^3 + 5^3+ 3^3 = 153)。

1.2. 其他自幂数

附:其他位数的自幂数名字:
一位自幂数:独身数
两位自幂数:没有
三位自幂数:水仙花数     
四位自幂数:四叶玫瑰数
五位自幂数:五角星数
六位自幂数:六合数
七位自幂数:北斗七星数
八位自幂数:八仙数
九位自幂数:九九重阳数
十位自幂数:十全十美数

常见自幂数:
三位的水仙花数共有4个:153,370,371,407;
四位的四叶玫瑰数共有3个:1634,8208,9474;
五位的五角星数共有3个:54748,92727,93084;
六位的六合数只有1个:548834;
七位的北斗七星数共有4个:1741725,4210818,9800817,9926315;
八位的八仙数共有3个:24678050,24678051,88593477
……

2. 编程实现

  1. 输出自幂数:

思路:

  • 求出数字的位数n;
  • 分解出每位上的数字;
  • 判断每个位置上的数的n次方是否等于此数。
  1. 输出水仙花数:
    思路:输出水仙花数与输出自幂数本质上是类似的;只不过少了求位数的这一步,位数直接为3。

2.1 输出水仙花数

2.1.1 C

#include<stdio.h>
#include<Windows.h>
#include<math.h>
void Search()
{
    
    
	for (int i = 100; i <1000; i++)
	{
    
    
		int sum = 0;
		int tem = i;//保证i不变 用tem计算(方便最后sum与i的判断)
		while (tem)
		{
    
    
			sum = sum + pow(tem % 10, 3);
			tem = tem / 10;
		}//求出每一位上的数的3次方之和sum
		if (sum == i)//判断sum是否等于数i,等于输出
		{
    
    
			printf("%d ", i);
		}
	}
}
int main()
{
    
    
	Search();
	system("pause");
	return 0;
}

运行结果:
在这里插入图片描述
注:

  • pow(a,b)是用来求a的b次方的,头文件math.h。

2.1.2 Java

public class TestDemo {
    
    
    public static void main(String[] args){
    
    
        //水仙花数是三位数
        for(int i=100;i<1000;i++){
    
    
            int huns=i/100;//百位
            int tens=i/10%10;//十位
            int ones=i%10;//个位
            if(i==Math.pow(huns,3)+Math.pow(tens,3)+Math.pow(ones,3)){
    
    
                System.out.println(i);
            }
        }
    }
}

运行结果:
在这里插入图片描述
注:

  • Math.pow(a,b)是java中求a的b次方的;

2.2输出自幂数

  • 注:这个具体要输出多大数,只要改变for循环次数就可【for (int i = ; i <***; i++)】。

2.2.1 C

#include<stdio.h>
#include<Windows.h>
#include<math.h>
int Count(int n)//求取位数
{
    
    
	if (n < 10)
	{
    
    
		return 1;
	}
	return 1 + Count(n / 10);
}
void Search()
{
    
    
	for (int i =0 ; i <= 100000; i++)
	{
    
    	
		int sum = 0;
		int tem = i;//保证i不变 用tem计算
		int digit = Count(tem);//位数	
		while (tem)
		{
    
    
			sum = sum+ pow(tem % 10, digit);
			tem = tem / 10;
		}
		if (sum == i)
		{
    
    
			printf("%d ",i);
		}
	}	
}
int main()
{
    
    
	Search();
	system("pause");
	return 0;
}

在这里插入图片描述

2.2.2Java

public class TestDemo {
    
    
    //求取位数
    public static int Digit(int x) {
    
    
        int digit=1;
        while(x>=10){
    
    
            digit++;
            x=x/10;
        }
        return digit;
    }
    public static void main(String[] args) {
    
    
        for(int i=0;i<1000;i++){
    
    
            int digit=Digit(i);
            int sum=0;
            int num=i;
            int c=digit;//位数即是次方数
            while(digit!=0){
    
    
                sum += Math.pow(num % 10, c);
                num/= 10;// t % 10得到每一位
                digit--;//循环count次
            }
            if(i==sum) {
    
    
                System.out.print(i + " ");
            }
        }
    }
}

在这里插入图片描述

2.2.3 求取一个数的位数

上述打印自幂数时用到了两种求位数的方法 (其实差不多):

  1. 老实巴交的求(循环)
   int digit=1;//首先我们认定输入的数最少一位
   while(x>=10)//当此数在一位以上时,循环
      {
    
    
         digit++;
         x=x/10;//每次循环减少一位(最后一位)
      }

举个栗子:
n=123 ,
digit=1; n=123>10;
digit=2; n=12>10;
digit=3; n=1<10(不满足条件出循环)

  1. 皮变馅不变,整了个递归
int Count(int n)//求取位数
{
    
    
	if (n < 10)//小于10的数一位
	{
    
    
		return 1;
	}
	return 1 + Count(n / 10);每次递归少一位(最后一位)
}

同样,举个栗子:
n=456,

扫描二维码关注公众号,回复: 12421282 查看本文章
  1. n=456>10; return 1+count (45)
  2. n=45>10 ; return 1+count(4)
  3. n=4<10;return 1
    返回2 , count(4)=1,return 1+1=2
    返回1 , count(45)=2,return1+3=3

2.3判断是否是水仙花数/自幂数

  • 改,照着上面改 缝缝补补差不多就是了。
  • 加一个从键盘输入;

c :

scanf("%d",&num);

java:

import java.util.Scanner;
Scanner sc = new Scanner(System.in);       
int num=sc.nextInt();
  • 然后改取位数的取位数;
  • 该判断的判断,输出是或不是。

猜你喜欢

转载自blog.csdn.net/Aug_IK/article/details/109527887