wayne 发表于 2010-9-6 09:46:15

回归数续集---自阶乘

145 =1!+4!+5!
那还有没有其他的数,其十进制的各位数字的阶乘之和等于其自身的值。

mathe 发表于 2010-9-6 11:44:39

容易估算,对于k位数,其各位数字阶乘之和不超过k*9!,
所以我们要求$k*9!>=10^{k-1}$,由此得出最多8位数,让后穷举吧

wayne 发表于 2010-9-6 11:54:53

2# mathe
exactly right !

wayne 发表于 2010-9-6 12:03:06

2# mathe

这题对于mathe来说,太水了,mathe还是解决那个 立方分数和问题吧

chyanog 发表于 2010-9-6 17:44:18

这道题似曾相识,记得年初好像在哪本VB二级的书上见过,而且ProjectEuler的34题求的是所有这样的数之和。我的穷举方法,肯定算不上高明,当做是C语言的练习吧,希望看到大牛的代码出现。
#include <stdio.h>
#include <time.h>
#define max 10000000 //10^7
int main()
{        double t0=clock();
        int n,i,t,sum,fac,count=0;
        for(n=1;n<max;n++)
        {        for(sum=0,i=n;i;i/=10)
                {        for(fac=1,t=1;t<=i%10;t++)
                        {
                                fac*=t;
                        }
                        sum+=fac;
                }
                if(sum==n) printf("%d:%4d\n",++count,n);
        }
        printf("%timing: %f s\n",(clock()-t0)/CLOCKS_PER_SEC);
        return 0;
}
总共找到4个:
1
2
145
40585

timing: 1.750000 s

chyanog 发表于 2010-9-6 17:53:04

用Mathematica就相当简单了,只是效率差强人意:
Select, Tr!] == # &] // Timing
{0.953, {1, 2, 145, 40585}}

chyanog 发表于 2010-9-6 21:10:48

我下面的代码,参考了别人的思路,效率有了较大提升:
#include <stdio.h>
#include <math.h>
#include <time.h>
int fac(int n)
{
        return n ? n*fac(n-1) : 1;
}
int main(int argc, char *argv[])
{
        double start=clock();
        int a;
        for(int i=0;i<=9;i++) a=fac(i);
       
        int max=10;
        for(int n=1;fac(9)*n>(int)pow(10.0,n);n++)
        max*=10;
        printf("max=%d\n",max);
       
        int n,i,sum,count=1;
        for(n=1;n<=max;n++)
        {        for(sum=0,i=n;i;i/=10)
                sum+=a;
                if(sum==n) printf("%d: %d\n",count++,n);
        }
        printf("timing: %f s\n",(clock()-start)/CLOCKS_PER_SEC);
        return 0;
}
max=10000000
1: 1
2: 2
3: 145
4: 40585
timing: 0.476000 s

Frankenstein 发表于 2010-9-8 14:33:24

用Mathematica就相当简单了,只是效率差强人意:
Select, Tr!] == # &] // Timing
{0.953, {1, 2, 145, 40585}}
chyanog 发表于 2010-9-6 17:53 http://bbs.emath.ac.cn/images/common/back.gif
这个太吓人了,呵呵。

mathe 发表于 2010-9-8 15:40:22

这个可以改进一下,改成寻找满足条件的16进制的数,也就是一个16进制数是它的16进制表示各位的阶乘之和。
如果再改成32进制数呢?

chyanog 发表于 2010-9-8 16:52:43

http://www.research.att.com/~njas/sequences/A014080
页: [1] 2
查看完整版本: 回归数续集---自阶乘