C语言中求指定位数的水仙花数

1 水仙花数概念及“常见”水仙花数

     水仙花数(Narcissistic number)也被称为超完全数字不变数(pluperfect digital invariant, PPDI)、自恋数、自幂数、阿姆斯壮数或阿姆斯特朗数(Armstrong number),水仙花数是指一个 3 位数,它的每个位上的数字的 3次幂之和等于它本身。例如:1^3 + 5^3+ 3^3 = 153。(百度百科)

水仙花数只是自幂数的一种,严格来说3位数的3次幂数才称为水仙花数。

常见水仙花数

水仙花数又称阿姆斯特朗数

三位的水仙花数共有4个:153,370,371,407;

四位的四叶玫瑰数共有3个:1634,8208,9474;

五位的五角星数共有3个:54748,92727,93084;

六位的六合数只有1个:548834;

七位的北斗七星数共有4个:1741725,4210818,9800817,9926315;

八位的八仙数共有3个:24678050,24678051,88593477;

九位的九九重阳数共有4个: 146511208,472335975,534494836,912985153;

十位的自幂数只有1个:4679307774

2.求三位数水仙花数以及指定位数的水仙花数

        所以求水仙花数的关键就是把每个位上的数字求出来,然后求出它们的幂次方之和,与求的这个数相比是否相等,相等就是水仙花数,然后输出,判断下一个数,直到判断完最后一个n位的数为止。

(1)求三位数的水仙花数

#include<stdio.h>
int main() {
	int m,n,i,a,sum;
	for(a=100; a<=999; a++) {//所有三位数
		m=a/100;//求最高位的数字 
		n=(a-m*100)/10;//求十位数字,先剪掉百位数字再求(352求十位时要减去3*100) 
		i=a-m*100-n*10;//个位 
		sum=m*m*m+n*n*n+i*i*i;//算出幂次方的和,然后比较 
		if(sum==a) {
			printf("%d ",a);
		}
	}
	return 0;
}

运行结果

(2)求指定位数的水仙花数

#include <stdio.h>
#include <math.h>
int main() {
	int a,m,n,i,j,sum;
	printf("输入需要求水仙花的位数:\n");
	scanf("%d",&a);
	for(n=pow(10,a-1); n<pow(10,a); n++) {
		j=0;//初始化j,防止上一次循环的j对本次造成干扰,以下同理
		int y=0;
		sum=0;
		for(i=a-1; i>=0; i--) {//循环三次求每个位数的值
			m=pow(10,i);//m为10的i次方
			if(i!=0) {
				j=(n-y)/m;//y为前面位数的和,比如求四位数的水仙花数时,
                    //如1503,第一个是求1,此时n减去0除以1000;第二位求5,
                                      //n减去j乘以1000再除以100
			} else {
				j=n-y;//求个位数字时直接减掉前面的和
			}
			y+=j*pow(10,i);//y为前几位的和,比如第一次求最大位1时,y为0,到这里就变成j乘以1000了
			sum+=pow(j,a);//幂次方的和
		}
		if(sum==n) {//判断时否为水仙花数
			printf("%d ",n);
		}
	}
	return 0;
}

这里用math.h中的pow函数表示幂次方

结果如下

 

制作不易,还请各位帅哥美女点个赞鼓励一下我这个小白!爱你!!!

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值