特殊的数

你听过一些特殊的数码,如:独身数, 水仙花数, 四叶玫瑰数, 五角星数, 六合数 ,北斗×××数,  八仙数, 九九重阳数 ,十全十美数。说到这你是否和我当初一样好奇呢,这是什么数呢!总的概括就是他们每位数的n次方的和等于他们本身。具体几次方要看他们有几位数了。

列如:

独身数

19,都是一位数那么他们每个数的1次方都等于他们本身,当然2位数的没有;

 

水仙花数

任意的3位数他们每个数的3次方的和相加等于他们自身;

 

四叶玫瑰数

任意的4位数他们每个数的4次方的和相加等于他们自身;

 

....................................................................................................

 

一次类推了一直到10,也就是到十全十美数

 

到此,知道只是知道而已,怎样通过运算快速的把他们找出来,这就要我们利用计算机运算我们写的JavaScript代码来实现了,呵呵我的计算机算到9位已经很吃力了!

 

现在就就开始一步一步探索吧...............

 

思路是这样的:比如我们通过循环语句找到一个三位数236,我们要通过函数分别取出2    3    6,然后分别3次方得到3个数,再把他们相加得到一个和,最后再使用逻辑语进行判断是否和他们自身相等即可,

 

我们先从找到水仙花数,然后类比去找其他的数,当然也可以是其他的数

 

// 因为水仙花数是三位数,所以可以从100开始赋值

for(var number=100;number<1000;++number)

{

// 把每次循环变动的number赋值给ys

var ys=number;

// 通过取余函数取出个位上的数

var ge=ys%10;

// 对一个数下舍入函数去掉个位上的数,此时变成一个两位数了

var ys=Math.floor(ys/10);

// 通过取余函数取出个位上的数,即原先三位数十位上的数

var shi=ys%10;

// 对一个数下舍入函数去掉个位上的数,此时变成一个一位数了

var ys=Math.floor(ys/10);

// 通过取余函数取出个位上的数,即原先三位数百位上的数

var bai=ys%10;  

// 对一个数下舍入函数去掉个位上的数,此时变成0了说明这个三数已经取完了

var ys=Math.floor(ys/10);

// 通过 Math.pow()分别求出每位数的3次方,再让他们相加求和

var he=Math.pow(ge,3)+Math.pow(shi,3)+Math.pow(bai,3);

// 用逻辑语句if判断他们的 和 是否与自身相等

if(number==he)

{

document.write(number);

document.write('
');

}

}

运行结果为 153    370    371    407

 

到这里我们已经算出了水仙花数了 接下来要做的事就是把写的代码找出规律,然后把规律相同的地方用上循环语句

上面的一句

var he=Math.pow(ge,3)+Math.pow(shi,3)+Math.pow(bai,3);

可以分成

Var he;

he+=Math.pow(gei,3);   ==  he=he+Math.pow(gei,3);

he+=Math.pow(shi,3);   ==  he=he+Math.pow(gei,3);

he+=Math.pow(bai,3);   ==  he=he+Math.pow(gei,3);

 

这里的变量ge   shi   bai 可以用一个变量代替,然后用循环叠加的方法表示出来,比如用变量wei

此时的代码为

 

for(var number=100;number<1000;++number)

{

var ys=number;

var he;

var wei;

 

var wei=ys%10;

var ys=Math.floor(ys/10);

he+=Math.pow(wei,3);

 

var wei=ys%10;

var ys=Math.floor(ys/10);

he+=Math.pow(wei,3);

 

var wei=ys%10;

var ys=Math.floor(ys/10);

he+=Math.pow(wei,3);


if(number==he)

{

document.write(number);

document.write('
');

 

}

}

 

这样我们就能看出

var wei=ys%10;

var ys=Math.floor(ys/10);

he+=Math.pow(wei,3);

三个部分是相等的,所以可以使用循环语句for进一步简化为

 

for(var number=100;number<1000;++number)

{

var ys=number;

var he=0;

var wei=0;

for(i=1;i<=3;++i)

{

var wei=ys%10;

var ys=Math.floor(ys/10);

he+=Math.pow(wei,3);

}

if(number==he)

{

document.write(number);

document.write('
');

 

}

}

到这里求出水仙花数的代码已经简化完毕了,接下来要做的事情就是给一个函数方法,通过分析让他输出其他特殊的数!

我们先来分析

独身数:是一个一位数的数所以他自身的一次方还是他自身 取值为19

水仙花数:是一个三位数所以取值为100999

四叶玫瑰:是个四位数所以取值为10009999

五角星数:是一个五位数所以取之为1000099999

.............................................................................................................................

同理到

十全十美:是一个十位数取值为10000000009999999999

 

然后中间循环的部分,是几位数就循环几次

分析完了我们用一个方法函数function

代码为:

function specialNumber(huashu)

{

// 为了更加直观可以定义一个数组来说明输出的为那个特殊数

        let numberNameList =[

                  '独身数','没有','水仙花数','四叶玫瑰数', '五角星数',

                  '六合数','北斗×××数','八仙数','九九重阳数','十全十美数'

                  ];

        // 输出对应的特殊数字的名称 例如:水仙花数

        document.write( numberNameList[ huashu-1 ] + ":
" );

        // 定义各个特殊数的取值范围

for(var number=Math.pow(10,huashu-1);number

{

var ys=number;

var he=0;

var wei=0;

// 各个特殊数循环的次数

for(var i=1;i<=huashu;++i)

{

var wei=ys%10;

var ys=Math.floor(ys/10);

he+=Math.pow(wei,huashu);

}

if(number==he)

{

document.write(number);

document.write('
');

 

}

}

}

 specialNumber(3);

现在就可以在specialNumber();的括号里去填写110去寻找你想知道的特殊数了,这里用的JavaScript写的我的电脑只运行到9位就吃不住了,如果php写执行率会高好多!