找回密码
 欢迎注册
楼主: medie2005

[擂台] 回归数

[复制链接]
 楼主| 发表于 2009-1-12 08:45:10 | 显示全部楼层
40位以下的回归数及其扩展:
3 digits search start!
0
1
153
407
370
371
4 digits search start!
0
1
1634
8208
9474
5 digits search start!
0
1
4151
4150
54748
93084
92727
6 digits search start!
0
1
548834
7 digits search start!
0
1
1741725
4210818
9926315
9800817
8 digits search start!
0
1
24678050
24678051
88593477
9 digits search start!
0
1
146511208
912985153
534494836
472335975
10 digits search start!
0
1
4679307774
11 digits search start!
0
1
82693916578
94204591914
40028394225
44708635679
42678290603
49388550606
32164049651
32164049650
12 digits search start!
0
1
13 digits search start!
0
1
564240140138
14 digits search start!
0
1
28116440335967
15 digits search start!
0
1
16 digits search start!
0
1
4338281769391371
4338281769391370
17 digits search start!
0
1
233411150132317
35875699062250035
35641594208964132
21897142587612075
18 digits search start!
0
1
19 digits search start!
0
1
3289582984443187032
4498128791164624869
4929273885928088826
1517841543307505039
20 digits search start!
0
1
63105425988599693916
21 digits search start!
0
1
449177399146038697307
128468643043731391252
22 digits search start!
0
1
23 digits search start!
0
1
21887696841122916288858
35452590104031691935943
28361281321319229463398
27907865009977052567814
27879694893054074471405
24 digits search start!
0
1
188451485447897896036875
174088005938065293023722
239313664430041569350093
25 digits search start!
0
1
114735624485461118832514
1550475334214501539088894
1553242162893771850669378
4422095118095899619457938
3706907995955475988644380
3706907995955475988644381
832662335985815242605071
832662335985815242605070
26 digits search start!
0
1
27 digits search start!
0
1
7584178683470015004720746
121270696006801314328439376
121204998563613372405438066
128851796696487777842012787
177265453171792792366489765
174650464499531377631639254
77888878776432530886487094
28 digits search start!
0
1
29 digits search start!
0
1
477144170826130800418527003
19008174136254279995012734741
19008174136254279995012734740
23866716435523975980390369295
14607640612971980372614873089
5022908050052864745436221003
4716716265341543230394614213
30 digits search start!
0
1
31 digits search start!
0
1
793545620525277858657607629822
2309092682616190307509695338915
1927890457142960697580636236639
1145037275765491025924292050346
32 digits search start!
0
1
17333509997782249308725103962772
33 digits search start!
0
1
186709961001538790100634132976990
186709961001538790100634132976991
32186410459473623435614002227248
34 digits search start!
0
1
1122763285329372541592822900204593
35 digits search start!
0
1
5250083909873201044638631458484846
12639369517103790328947807201478392
12679937780272278566303885594196922
7673249664848285722449710136138169
36 digits search start!
0
1
91097771122214850683543503173498149
37 digits search start!
0
1
418510620208153136884574959404115822
1219167219625434121569735803609966019
618670315011216949642642321868915308
38 digits search start!
0
1
7403697806790834730831423191927508283
7320233109580046612992702336326619665
12815792078366059955099770545296129367
39 digits search start!
0
1
115132219018763992565095597973971522401
115132219018763992565095597973971522400
83281830613691836766959173718984508549
83281823928125880164896079973522049472
16427762135335641330720936105651700735
time : 13426313 ms
press any key to continue...
毋因群疑而阻独见  毋任己意而废人言
毋私小惠而伤大体  毋借公论以快私情
发表于 2009-1-12 08:50:36 | 显示全部楼层
和我的结果对照了么?

另外, 你的时间多了
毋因群疑而阻独见  毋任己意而废人言
毋私小惠而伤大体  毋借公论以快私情
发表于 2010-3-23 13:12:34 | 显示全部楼层
一个调用了gmp库,
一个是 纯C写的,
很强大
毋因群疑而阻独见  毋任己意而废人言
毋私小惠而伤大体  毋借公论以快私情
发表于 2010-3-23 15:53:13 | 显示全部楼层
回归数
又叫  Narcissistic Number
(自恋的数)
毋因群疑而阻独见  毋任己意而废人言
毋私小惠而伤大体  毋借公论以快私情
发表于 2010-5-6 23:09:14 | 显示全部楼层
又称自幂数?
毋因群疑而阻独见  毋任己意而废人言
毋私小惠而伤大体  毋借公论以快私情
发表于 2010-5-7 10:10:48 | 显示全部楼层
不错,这么翻译好像挺到位的
毋因群疑而阻独见  毋任己意而废人言
毋私小惠而伤大体  毋借公论以快私情
发表于 2011-5-12 22:50:52 | 显示全部楼层
没想到这里也讨论过这个问题,前两天用c#写了1个,增加了一个提前剪枝的步骤,求所有88个大概1分钟左右吧。
毋因群疑而阻独见  毋任己意而废人言
毋私小惠而伤大体  毋借公论以快私情
发表于 2013-4-12 17:16:17 | 显示全部楼层
我的39位的2个
1151322190**...**22401
1151322190**...**22400
好像是连续的,有意思。。
209秒的样子

评分

参与人数 1金币 +20 收起 理由
gxqcn + 20 首帖奖励,欢迎常来。

查看全部评分

毋因群疑而阻独见  毋任己意而废人言
毋私小惠而伤大体  毋借公论以快私情
发表于 2013-4-12 17:17:07 | 显示全部楼层
  1. /*21位水仙花数问题
  2. 耗时: 约11s
  3. By: 牧马
  4. At: 2012年1月15日
  5. */

  6. #include <stdio.h>
  7. #include <stdlib.h>
  8. #include <string.h>
  9. #include <time.h>

  10. #define DIG 39
  11. #define LIMIT 7
  12. #define MAX 100

  13. char ncf[10][DIG+10];
  14. char ncf21bei[10][DIG+1][DIG+10];
  15. //char goal[MAX][DIG+10];

  16. //字符串相加函数
  17. void add_str(char x[], const char y[])
  18. {
  19.     int i, temp, lenx, leny;

  20.     for(i=0,temp=0; x[i]!='\0' && y[i]!='\0'; i++)
  21.     {
  22.         temp=x[i]-'0'+y[i]-'0'+temp;
  23.         x[i]=temp%10+'0';
  24.         temp/=10;
  25.     }
  26.     lenx=strlen(x);
  27.     leny=strlen(y);
  28.     while(i<lenx)
  29.     {
  30.             temp=x[i]-'0'+temp;
  31.         x[i]=temp%10+'0';
  32.         temp/=10;
  33.                i++;
  34.     }
  35.     while(i<leny)
  36.     {
  37.         temp=y[i]-'0'+temp;
  38.         x[i]=temp%10+'0';
  39.         temp/=10;
  40.                i++;
  41.     }
  42.     while(temp)
  43.     {
  44.         x[i]=temp%10+'0';
  45.         temp/=10;
  46.         i++;
  47.     }
  48.     x[i]='\0';
  49. }

  50. //字符串乘以一个整数
  51. int chengyi_str(char x[], int n)
  52. {
  53.     char temp[DIG+10], i, j;

  54.     if(n<=0)
  55.     {
  56.         x[0]='0';
  57.         x[1]='\0';
  58.         return 0;
  59.     }
  60.     else
  61.     {
  62.         strcpy(temp, x);
  63.         i=1;
  64.         while(i<n/2) i*=2;
  65.         j=i;
  66.         for(; i>1; i/=2)
  67.             add_str(x, x);
  68.         while(j<n)
  69.         {
  70.             add_str(x, temp);
  71.             j++;
  72.         }
  73.         return 0;
  74.     }
  75. }

  76. void init()
  77. {
  78.     int i,j;
  79.     ncf[0][0]='0';
  80.     ncf[0][1]='\0';
  81.     ncf[1][0]='1';
  82.     ncf[1][1]='\0';
  83.     for(i=2; i<10; i++)
  84.     {
  85.         ncf[i][0]=i+'0';
  86.         ncf[i][1]='\0';
  87.         for(j=1; j<DIG; j++)
  88.         {
  89.             chengyi_str(ncf[i], i);
  90.         }
  91.     }
  92.     for(i=0; i<10; i++)
  93.     {
  94.         ncf21bei[i][0][0]='0';
  95.         ncf21bei[i][0][1]='\0';
  96.         strcpy(ncf21bei[i][1], ncf[i]);
  97.         for(j=2; j<=DIG; j++)
  98.         {
  99.             strcpy(ncf21bei[i][j], ncf21bei[i][j-1]);
  100.             add_str(ncf21bei[i][j], ncf[i]);
  101.         }
  102.     }
  103.     /*for(i=0; i<10; i++)
  104.     {
  105.         for(j=0; j<=DIG; j++)
  106.         printf("%d的%d倍:%s\n", i, j, ncf21bei[i][j]);
  107.         system("pause");
  108.     }*/
  109. }

  110. //穷举法搜索
  111. /*void find()
  112. {
  113.     char  a[DIG+10], b[DIG+10];
  114.     int i, k, cnta[10], cntb[10];
  115.     //cnta\cntb统计当前数a\b中各数字出现的次数
  116.     //a为当前要判断的数,b为对a求出的水仙花数,c为b排序后的数
  117.     memset(a,0,(DIG+10)*sizeof(char));
  118.     memset(cnta,0,10*sizeof(int));
  119.     for(i=0; i<DIG-1; i++)
  120.     {
  121.         a[i]='0';
  122.         cnta[0]++;
  123.     }
  124.     a[i]='1';
  125.     cnta[1]++;
  126.     a[i+1]='\0';
  127.     do
  128.     {
  129.         //初始化数据
  130.         memset(b,0,(DIG+10)*sizeof(char));
  131.         memset(cntb,0,10*sizeof(int));
  132.         b[0]='0';
  133.         b[1]='\0';
  134.         //计算b
  135.         for(i=0; i<10; i++)
  136.         {
  137.             if(cnta[i])
  138.             add_str(b, ncf21bei[i][cnta[i]]);
  139.         }
  140.         for(i=0; b[i]!='\0'; i++)
  141.             cntb[b[i]-'0']++;
  142.             cntb[0]+=DIG-i;
  143.         //判断是否是水仙花数
  144.         for(i=0; i<10; i++)
  145.             if(cnta[i]!=cntb[i])
  146.             break;
  147.         if(i==10 && strlen(b)==DIG)
  148.         {
  149.                 for(i=DIG-1; i>=0; i--)
  150.                 printf("%c", b[i]);
  151.             printf("\n", b);
  152.             printf("已耗时:%fs\n", 1.0*clock()/CLOCKS_PER_SEC);
  153.         }
  154.         //取下一个要判断的数
  155.         i=DIG-1;
  156.         while(i>=0 && a[i]=='9')
  157.         {
  158.             cnta[a[i]-'0']--;
  159.             i--;
  160.         }
  161.         if(cnta[a[i]-'0'])
  162.         cnta[a[i]-'0']--;
  163.         k=a[i]+1;
  164.         while(i<DIG)
  165.         {
  166.             cnta[k-'0']++;
  167.             a[i++]=k;
  168.         }
  169.     }while(a[0]!='9');
  170. }*/

  171. int na[10], nb[10];
  172. char b[DIG+10];
  173. void dfs(int step, int nn)
  174. {
  175.         int i;
  176.     if(nn==0)//step==10 ||
  177.     {
  178.             //不是DIG位数直接否决
  179.         if(b[DIG]!='\0') return;
  180.                memset(nb,0,sizeof(nb));
  181.                for(i=0; b[i]!='\0'; i++)
  182.                 nb[b[i]-'0']++;
  183.         //判断是否是水仙花数
  184.                 for(i=0; i<10; i++)
  185.                         if(na[i]!=nb[i])
  186.                                 return;
  187.                 //打印出水仙花数
  188.                 for(i=DIG-1; i>=0; i--)
  189.                         printf("%c", b[i]);
  190.                 printf("\n");
  191.                 //printf("已耗时:%fs\n", 1.0*clock()/CLOCKS_PER_SEC);
  192.                 return;
  193.     }
  194.     char temp[DIG+10]="\0";
  195.     if(step==9)
  196.     {
  197.             strcpy(temp, b);
  198.             na[9]=nn;
  199.             if(nn)
  200.                     add_str(b, ncf21bei[9][na[9]]);
  201.             dfs(10, 0);
  202.             strcpy(b, temp);
  203.             na[9]=0;
  204.             return ;
  205.     }
  206.     if(step<9)
  207.     {
  208.             //下列语句可以缩短程序运行时间,但是理论上影响程序的准确性
  209.             /*==============================*/
  210.             if(na[step-1]>LIMIT) return;
  211.             /*==============================*/
  212.            
  213.             for(i=0; i<=nn; i++)
  214.             {
  215.                     strcpy(temp, b);
  216.                     na[step]=i;
  217.                     if(i)
  218.                             add_str(b, ncf21bei[step][i]);
  219.                     dfs(step+1, nn-i);
  220.                     strcpy(b, temp);
  221.                     na[step]=0;
  222.             }
  223.             return ;
  224.     }
  225. }

  226. int main()
  227. {
  228.     char x[DIG+1]="5", y[DIG+1]="9";
  229.     int n=5;
  230.     init();
  231.     dfs(0, DIG);//深度优先搜索
  232.     //system("pause");
  233.     //find();//穷举搜索
  234.     printf("\n共耗时:%fs\n", 1.0*clock()/CLOCKS_PER_SEC);
  235.     return 0;
  236. }
复制代码
毋因群疑而阻独见  毋任己意而废人言
毋私小惠而伤大体  毋借公论以快私情
发表于 2013-6-2 11:05:35 | 显示全部楼层
除0以外是否存在a0a1a2.........an=a0^a0+a1^a1+a2^a2+an^an
a0a1a2......an表示整数中的某一位。a0第一位,a1第二位.......。
毋因群疑而阻独见  毋任己意而废人言
毋私小惠而伤大体  毋借公论以快私情
您需要登录后才可以回帖 登录 | 欢迎注册

本版积分规则

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

GMT+8, 2024-4-20 13:07 , Processed in 0.084659 second(s), 15 queries .

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

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