目录
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. 编程实现
- 输出自幂数:
思路:
- 求出数字的位数n;
- 分解出每位上的数字;
- 判断每个位置上的数的n次方是否等于此数。
- 输出水仙花数:
思路:输出水仙花数与输出自幂数本质上是类似的;只不过少了求位数的这一步,位数直接为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 求取一个数的位数
上述打印自幂数时用到了两种求位数的方法 (其实差不多):
- 老实巴交的求(循环)
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(不满足条件出循环)
- 皮变馅不变,整了个递归
int Count(int n)//求取位数
{
if (n < 10)//小于10的数一位
{
return 1;
}
return 1 + Count(n / 10);每次递归少一位(最后一位)
}
同样,举个栗子:
n=456,
- n=456>10; return 1+count (45)
- n=45>10 ; return 1+count(4)
- 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();
- 然后改取位数的取位数;
- 该判断的判断,输出是或不是。