一个算出任意位数的水仙花数的函数如下:
var arr =[];
/*更改num确定取值范围*/
for(var num = 100; num <= 9999;num++){
/*多位数版本*/
var i = 0;
/*设置一个数用来存储变量num*/
var suan = num;
do{
/*取出个位*/
arr[i] = suan%10;
/*去掉“个位”*/
suan = Math.floor(suan/ 10) ;
i++;
}while(suan >= 1 )
var sum = 0;
for(var i=0;i<arr.length;i++)
{
/*累加各个数字的n次幂(n为数字的位数,如100为3,1000为4)*/
sum+= Math.pow(arr[i],arr.length);
}
if(sum == num){
console.log(num);
}
}
不过百度上说。。
水仙花数只是自幂数的一种,严格来说3位数的3次幂数才称为水仙花数。
附:其他位数的自幂数名字
一位自幂数:独身数
两位自幂数:没有
三位自幂数:水仙花数
四位自幂数:四叶玫瑰数
五位自幂数:五角星数
六位自幂数:六合数
七位自幂数:北斗七星数
八位自幂数:八仙数
九位自幂数:九九重阳数
十位自幂数:十全十美数
不过不管了,要的就是一式多用的功能就行了。
推导过程如下:
通常我们求三位数的水仙花是这么算的
for(var i = 100; i < 1000; i++){ //百位 var a = Math.floor(i / 100); // 十位 var b = Math.floor((i - a * 100)/10); // 个位 var c = i % 10; if(Math.pow(a,3) + Math.pow(b,3) + Math.pow(c,3) === i){ console.log(i+'是一个水仙花数'); } }
这样的做法似乎没有什么规律,那就先求个位,再求十位,百位
于是就改成了这样(把循环和累加省掉了)
//个位 ge = num%10; // 十位 shi = Math.floor(num / 10) %10; // 百位 bai = Math.floor(num / 100);
也就等价于
//个位 ge = num%10; // 十位 shi = Math.floor(num / 10) %10; // 百位,百位/100后余10即等于本身,因为除了100且化为整数之后只剩个位数,个位对10取余依旧是自己 bai = Math.floor(num / 10/10) % 10;
也就是一直在对10取余之后除以10再对10取余,
而取余出来时的数为我们所要的个、十、百。。等位数
除以十则是一直在循环除以同一个数
那自然取余的数用数组存取,
而这个用来除以10的数则是循环累除,直至小于1
于是得到
var arr =[]; /*更改num确定取值范围*/ for(var num = 100; num <= 9999;num++){ /*多位数版本*/ var i = 0; /*设置一个数用来存储变量num*/ var suan = num; do{ /*取出个位*/ arr[i] = suan%10; /*去掉“个位”*/ suan = Math.floor(suan/ 10) ; i++; }while(suan >= 1 ) var sum = 0; for(var i=0;i<arr.length;i++) { /*累加各个数字的n次幂(n为数字的位数,如100为3,1000为4)*/ sum+= Math.pow(arr[i],arr.length); } if(sum == num){ console.log(num); } }