fortran误差函数(趣味算法-自幂数)
fortran误差函数(趣味算法-自幂数)六位自幂数:六合数五位自幂数:五角星数二位自幂数:没有三位自幂数:水仙花数四位自幂数:四叶玫瑰数
今天我们利用Fortran来实现n位数的自幂数。这是一个有趣的算法。
自幂数是指一个 n 位数,它的每个位上的数字的 n 次幂之和等于它本身。(例如:当n为4时,有1^4 6^4 3^4 4^4 = 1634,1634即是n为4时的一个自幂数)
自幂数包括:
一位自幂数:独身数
二位自幂数:没有
三位自幂数:水仙花数
四位自幂数:四叶玫瑰数
五位自幂数:五角星数
六位自幂数:六合数
七位自幂数:北斗七星数
八位自幂数:八仙数
九位自幂数:九九重阳数
十位自幂数:十全十美数
开发思路:
1,输入n,则n位数就在10^(n-1)和(10^n)-1之间。例如输入“4”,则最小的四位数就是10^(4-1)=1000,最大的四位数是(10^4)-1=9999。
2,当n=1时,直接就是1-9。
3,取出n位数的每一位。以4位数字1234为例,取千位1,1234除以10^(4-1)=1。取百位2,先取余mod(1234 10^(4-1)=234,再除以10^(4-1-1)=2。取十位3,先取余mod(1234 10^(4-1-1)=34,再除以10^(4-1-1-1)=3。取个位4,直接和10取余,mod(1234 10)=4。朋友们看看规律。我们可以先取出n位数的最高位和最低位,中间的位数循环取出。
4,每一位的n次方相加,如果等于这个n位数,则这个数就是自幂数。
代码如下:
program test60
implicit none
integer i j n
integer kk ss
100 write(* *)"请输入幂指数位数:(退出0)"
read(* *)n
if(n<1)then
stop
else
j=0
do kk=10**(n-1) (10**n)-1 1
if(n==1)then
write(* *)"幂指数" kk
j=j 1
else
ss=0
do i=1 n-2 1 !减去最高位和最低位
ss=ss (mod(kk 10**(n-i))/10**(n-i-1))**n
end do
ss=ss (kk/10**(n-1))**n mod(kk 10)**n !最后加上最高位和最低位
if(ss==kk)then
write(* *)"幂指数" kk
j=j 1
end if
end if
end do
write(* *)"共有" j "个。"
go to 100
end if
end program test60
运行程序:
我的电脑配置i5 8G。运行前7位都是秒出,运行8位时略有停顿,运行9位大约有18分钟,运行10位我是一晚上没关机,早上才出结果。
最后给出运行的结果:
n为1时,自幂数称为独身数。显然,1 2 3,4 5 6 7 8 9都是自幂数。
n为2时,没有自幂数。
n为3时,自幂数称为水仙花数,有4个:153,370,371,407;
n为4时,自幂数称为四叶玫瑰数,共有3个:1634,8208,9474;
n为5时,自幂数称为五角星数,共有3个:54748,92727,93084;
n为6时,自幂数称为六合数, 只有1个:548834;
n为7时,自幂数称为北斗七星数, 共有4个:1741725,4210818,9800817,9926315;
n为8时,自幂数称为八仙数, 共有3个:24678050,24678051,88593477;
n为9时,自幂数称为九九重阳数,共有4个:146511208,472335975,534494836,912985153;
n为10时,自幂数称为十全十美数,只有1个:4679307774。
朋友们如果机器配置好,可以运行一下11,12位,我就不折腾电脑了。哈哈。