找回密码
 欢迎注册
查看: 16941|回复: 19

[讨论] 回归数续集---自阶乘

[复制链接]
发表于 2010-9-6 09:46:15 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有账号?欢迎注册

×
145 =1!+4!+5!
那还有没有其他的数,其十进制的各位数字的阶乘之和等于其自身的值。
毋因群疑而阻独见  毋任己意而废人言
毋私小惠而伤大体  毋借公论以快私情
发表于 2010-9-6 11:44:39 | 显示全部楼层
容易估算,对于k位数,其各位数字阶乘之和不超过k*9!,
所以我们要求$k*9!>=10^{k-1}$,由此得出最多8位数,让后穷举吧
毋因群疑而阻独见  毋任己意而废人言
毋私小惠而伤大体  毋借公论以快私情
 楼主| 发表于 2010-9-6 11:54:53 | 显示全部楼层
2# mathe
exactly right !
毋因群疑而阻独见  毋任己意而废人言
毋私小惠而伤大体  毋借公论以快私情
 楼主| 发表于 2010-9-6 12:03:06 | 显示全部楼层
2# mathe

这题对于mathe来说,太水了,mathe还是解决那个 立方分数和问题吧
毋因群疑而阻独见  毋任己意而废人言
毋私小惠而伤大体  毋借公论以快私情
发表于 2010-9-6 17:44:18 | 显示全部楼层
这道题似曾相识,记得年初好像在哪本VB二级的书上见过,而且ProjectEuler的34题求的是所有这样的数之和。我的穷举方法,肯定算不上高明,当做是C语言的练习吧,希望看到大牛的代码出现。

  1. #include <stdio.h>
  2. #include <time.h>
  3. #define max 10000000 //10^7
  4. int main()
  5. {        double t0=clock();
  6.         int n,i,t,sum,fac,count=0;
  7.         for(n=1;n<max;n++)
  8.         {        for(sum=0,i=n;i;i/=10)
  9.                 {        for(fac=1,t=1;t<=i%10;t++)
  10.                         {
  11.                                 fac*=t;
  12.                         }
  13.                         sum+=fac;
  14.                 }
  15.                 if(sum==n) printf("%d:%4d\n",++count,n);
  16.         }
  17.         printf("%timing: %f s\n",(clock()-t0)/CLOCKS_PER_SEC);
  18.         return 0;
  19. }
复制代码
总共找到4个:
1
2
145
40585

timing: 1.750000 s
毋因群疑而阻独见  毋任己意而废人言
毋私小惠而伤大体  毋借公论以快私情
发表于 2010-9-6 17:53:04 | 显示全部楼层
用Mathematica就相当简单了,只是效率差强人意:

  1. Select[Range[10^5], Tr[IntegerDigits[#]!] == # &] // Timing
复制代码
{0.953, {1, 2, 145, 40585}}
毋因群疑而阻独见  毋任己意而废人言
毋私小惠而伤大体  毋借公论以快私情
发表于 2010-9-6 21:10:48 | 显示全部楼层
我下面的代码,参考了别人的思路,效率有了较大提升:

  1. #include <stdio.h>
  2. #include <math.h>
  3. #include <time.h>
  4. int fac(int n)
  5. {
  6.         return n ? n*fac(n-1) : 1;
  7. }
  8. int main(int argc, char *argv[])
  9. {
  10.         double start=clock();
  11.         int a[10];
  12.         for(int i=0;i<=9;i++) a[i]=fac(i);
  13.        
  14.         int max=10;
  15.         for(int n=1;fac(9)*n>(int)pow(10.0,n);n++)
  16.         max*=10;
  17.         printf("max=%d\n",max);
  18.        
  19.         int n,i,sum,count=1;
  20.         for(n=1;n<=max;n++)
  21.         {        for(sum=0,i=n;i;i/=10)
  22.                 sum+=a[i%10];
  23.                 if(sum==n) printf("%d: %d\n",count++,n);
  24.         }
  25.         printf("timing: %f s\n",(clock()-start)/CLOCKS_PER_SEC);
  26.         return 0;
  27. }
复制代码
max=10000000
1: 1
2: 2
3: 145
4: 40585
timing: 0.476000 s

评分

参与人数 1金币 +10 鲜花 +6 收起 理由
wayne + 10 + 6

查看全部评分

毋因群疑而阻独见  毋任己意而废人言
毋私小惠而伤大体  毋借公论以快私情
发表于 2010-9-8 14:33:24 | 显示全部楼层
用Mathematica就相当简单了,只是效率差强人意:

  1. Select[Range[10^5], Tr[IntegerDigits[#]!] == # &] // Timing
复制代码
{0.953, {1, 2, 145, 40585}}
chyanog 发表于 2010-9-6 17:53

这个太吓人了,呵呵。
毋因群疑而阻独见  毋任己意而废人言
毋私小惠而伤大体  毋借公论以快私情
发表于 2010-9-8 15:40:22 | 显示全部楼层
这个可以改进一下,改成寻找满足条件的16进制的数,也就是一个16进制数是它的16进制表示各位的阶乘之和。
如果再改成32进制数呢?
毋因群疑而阻独见  毋任己意而废人言
毋私小惠而伤大体  毋借公论以快私情
发表于 2010-9-8 16:52:43 | 显示全部楼层
毋因群疑而阻独见  毋任己意而废人言
毋私小惠而伤大体  毋借公论以快私情
您需要登录后才可以回帖 登录 | 欢迎注册

本版积分规则

小黑屋|手机版|数学研发网 ( 苏ICP备07505100号 )

GMT+8, 2024-5-6 16:08 , Processed in 0.049618 second(s), 18 queries .

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

快速回复 返回顶部 返回列表