求0~999之间的所有“水仙花数”并输出。
“水仙花数”是指一个三位数,其各位数字的立方和确好等于该数本身,如;153=1+5+3?,则153是一个“水仙花数”。
/*
首先我们先了解一下什么叫水仙花,在数论中,水仙花数(Narcissistic number)也称为自恋数、自幂数、阿姆斯壮数或阿姆斯特朗数(Armstrong number),是指一N位数,其各个数之N次方和等于该数。
例如153、370、371及407就是三位数的水仙花数,其各个数之立方和等于该数:
153 = 1^3 + 5^3 + 3^3。
370 = 3^3 + 7^3 + 0^3。
371 = 3^3 + 7^3 + 1^3。
407 = 4^3 + 0^3 + 7^3。
*/
要求一个水仙花,我们先要得到它的百位上的数字,怎么得到呢?我们只需要让这个数除以一百就得到了百位上的数字;
同理,用这个数先对一百取余得到一个两位数,再用得到的两位数除以10,我们便得到十位数的数字;
个位上的数字当然只需要对10取余就得到啦,以下就是具体的得到相应数字的计算公式
//a=i/100; // 153除以100得到1
//b=(i%100)/10; // 153对100取余得到53,53对10取余得到3
//c=i%10;
接下来我们就需要对这个数进行判断,将各个数字进行立方计算并相加,把相加的结果与这个数进行比较,如果是一样打的数,那么这个数就是水仙花。
if (i == sum && i != 0 && i !=1) //这里我们需要判断
#include<stdio.h> int main() { int i,sum; int a,b,c; for(i=0;i<999;i++) { a=i/100; // 153除以100得到1 b=(i%100)/10; // 153对100取余得到53,53对10取余得到3 c=i%10; sum = a*a*a+b*b*b+c*c*c; if (i == sum && i != 0 && i !=1) { printf("%d ",i); } } return 0; }
其实,以上方法是大多数人的正常思考习惯,虽然按要求求出了0~999之间的水仙花,但是还是有局限性的,以下给出通用的简洁算法。
int main() { int i = 0; for(i=1; i<=1000; i++) { //1. 获得i的位数 //123 int tmp = 0; int count = 1; int sum = 0; tmp = i; while(tmp>=10) { count++; tmp=tmp/10; } //2. 获得i的每一位,计算次方和
tmp = i; while(tmp) { sum = sum + pow(tmp%10, count); tmp = tmp/10; } //3. 判断是否为水仙花数 if(sum == i) { printf("%d ", i); } } return 0; }