找回密码
 欢迎注册
楼主: 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. for(i=0; i<=nn; i++)
  213. {
  214. strcpy(temp, b);
  215. na[step]=i;
  216. if(i)
  217. add_str(b, ncf21bei[step][i]);
  218. dfs(step+1, nn-i);
  219. strcpy(b, temp);
  220. na[step]=0;
  221. }
  222. return ;
  223. }
  224. }
  225. int main()
  226. {
  227. char x[DIG+1]="5", y[DIG+1]="9";
  228. int n=5;
  229. init();
  230. dfs(0, DIG);//深度优先搜索
  231. //system("pause");
  232. //find();//穷举搜索
  233. printf("\n共耗时:%fs\n", 1.0*clock()/CLOCKS_PER_SEC);
  234. return 0;
  235. }
复制代码
毋因群疑而阻独见  毋任己意而废人言
毋私小惠而伤大体  毋借公论以快私情
发表于 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-11-21 20:52 , Processed in 0.030651 second(s), 15 queries .

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

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