特殊的数
你听过一些特殊的数码,如:独身数, 水仙花数, 四叶玫瑰数, 五角星数, 六合数 ,北斗×××数, 八仙数, 九九重阳数 ,十全十美数。说到这你是否和我当初一样好奇呢,这是什么数呢!总的概括就是他们每位数的n次方的和等于他们本身。具体几次方要看他们有几位数了。
列如:
独身数
1到9,都是一位数那么他们每个数的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('
');
}
}
到这里求出水仙花数的代码已经简化完毕了,接下来要做的事情就是给一个函数方法,通过分析让他输出其他特殊的数!
我们先来分析
独身数:是一个一位数的数所以他自身的一次方还是他自身 取值为1到9
水仙花数:是一个三位数所以取值为100到999
四叶玫瑰:是个四位数所以取值为1000到9999
五角星数:是一个五位数所以取之为10000到99999
.............................................................................................................................
同理到
十全十美:是一个十位数取值为1000000000到9999999999
然后中间循环的部分,是几位数就循环几次
分析完了我们用一个方法函数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();的括号里去填写1到10去寻找你想知道的特殊数了,这里用的JavaScript写的我的电脑只运行到9位就吃不住了,如果php写执行率会高好多!