切换到宽版
  • 9176阅读
  • 9回复

高手求解 [复制链接]

上一主题 下一主题
离线哦老天
 
只看楼主 倒序阅读 0 发表于: 2006-02-06
153=1^3+5^3+3^3 ,371=3^3+7^3+1^3, 370=3^3+7^3+0^3, 407=4^3+0^3+7^3他们都是三位数且等于各位数字的三次幂之和,这种巧合不能不令人感到惊讶.更为称奇的是,竞然构造出其值等于各位数字四(五,六)次幂之和的四(五,六)位数:1634=1^4+6^4+3^4+4^4 54748=5^5+4^5+7^5+4^5+8^5 548834=5^6+4^6+8^6+8^6+3^6+4^6像这种其值等于各位数字的 n 次幂之和的 n 位数,称为 n 位 n 次幂回归数.简称为回归数,请输出10(20)位以内的回归数.(运算时间<5S).

一位回归数:1,2,3,4,5,6,7,8,9
二位回归数:不存在
三位回归数:153,370,371,407
四位回归数:1634,8208,9474
五位回归数:54748,92727,93084

当N较小时,程序不难,当N<6时,这个运算量一般都能完成.当N增大时,程序运算量极巨增大,运算时间就会很长,如何设计一个有效算法提高运算速度,在5S内能运算出的几位的回归数??
离线stevenjl

只看该作者 1 发表于: 2006-02-07

随手写了一个,的确超时严重……


测试结果:
Test 1 OK [0.00 secs] (n=1)
Test 2 OK [0.00 secs] (n=5)
Test 3 OK [0.60 secs] (n=10)
Test 4 OK [1.26 secs] (n=11)
Test 5 OK [2.56 secs] (n=12)
Test 6 OK [4.98 secs] (n=13)
Test 7 OK [9.42 secs] (n=14)
Test 8 OK [17.19 secs] (n=15)
Test 9 OK [30.49 secs] (n=16)
Test 10 OK [52.06 secs] (n=17)
Test 11 OK [87.22 secs] (n=18)
Test 12 OK [143.36 secs] (n=19)


说明:由于没有用高精度,我的程序最高支持19位(n=19)吧。


我的输出(空表示没有):


我的程序:


程序中所有的<>请替换为[],论坛的问题……

测试环境:
Intel Pentium 4 1400MHz
256MB DDR 333
Windows XP SP2
Freepascal 2.0.2
Dream Walker...
离线stevenjl

只看该作者 2 发表于: 2006-02-08
说明:我的程序需要Freepascal编译……
Dream Walker...
离线medie2005
只看该作者 3 发表于: 2006-06-03
csdn上的讨论,楼主可以去看看,网址:
http://community.csdn.net/Expert/topic/4734/4734515.xml?temp=.8288233
离线勇气les
只看该作者 4 发表于: 2006-07-20
好东西————
离线johnson
只看该作者 5 发表于: 2006-08-22
不错~~
离线stevenjl

只看该作者 6 发表于: 2006-10-03
今天用C语言重新写了个,快了很多。

测试结果:
Test 1 OK [0.00 secs] (n=1)
Test 2 OK [0.00 secs] (n=5)
Test 3 OK [0.17 secs] (n=10)
Test 4 OK [0.36 secs] (n=11)
Test 5 OK [0.75 secs] (n=12)
Test 6 OK [1.50 secs] (n=13)
Test 7 OK [2.64 secs] (n=14)
Test 8 OK [4.70 secs] (n=15)
Test 9 OK [8.23 secs] (n=16)
Test 10 OK [13.90 secs] (n=17)
Test 11 OK [23.30 secs] (n=18)
Test 12 OK [38.00 secs] (n=19)

5秒内的回文数达到了15位!

测试环境:
Intel Pentium 4 1400MHz
256MB DDR 333
Windows XP SP2
DEV C++ 4.9.9.2

源代码:
  1. #include <stdio.h>
  2. unsigned long long int cf[10];
  3. short zhl[21],n;
  4. void mcf();
  5. unsigned long long int power(int base, int c);
  6. int incr();
  7. void pdhsc();
  8. main()
  9. {
  10. int i;
  11. for (n=1; n<=19; n++)
  12.   {
  13.     printf("%d-digit numbers:\n",n);
  14.     mcf();
  15.     for (i= 1; i<= n; i++) zhl[i] = 0;
  16.     while (incr())
  17.     {
  18.       pdhsc();
  19.     }
  20.     printf("\n");
  21.   }
  22. }
  23. void mcf()
  24. {
  25. int i;
  26. cf[0]=0;
  27. for (i=1; i<= 9; i++) cf[i] = power(i,n);
  28. }
  29. unsigned long long int power(int base, int c)
  30. {
  31. int i;
  32. unsigned long long int temp;
  33. temp=1;
  34. for (i=1; i<= c; i++) temp *= base;
  35. return temp;
  36. }
  37. int incr()
  38. {
  39. int i,j;
  40. ++zhl[n];
  41. for (i= n; i>= 2; i--)
  42.   {
  43.     if (zhl[i] != 10) break;
  44.     ++zhl[i-1];
  45.     for (j=i; j<=n; j++) zhl[j]=zhl[i-1];
  46.   }
  47. if ((zhl[1] ==10) && (zhl[n] == 10)) return 0;
  48. return 1;
  49. }
  50. void pdhsc()
  51. {
  52. int i,tj[10];
  53. unsigned long long int temp,min,max,temp2;
  54. temp=0;
  55. for (i=1; i<= n; i++) temp += cf[zhl[i]];
  56. min= power(10,n-1);
  57. max= min*10;
  58. if ((temp < min) || (temp >= max)) return;
  59. for (i=0; i<= 9; i++) tj[i]=0;
  60. for (i=1; i<= n; i++) ++tj[zhl[i]];
  61. temp2 = temp;
  62. for (i=1; i<= n; i++)
  63.   {
  64.     --tj[temp % 10];
  65.     temp /= 10;
  66.   }
  67. for (i=1; i<= 9; i++) if (tj[i] != 0) return;
  68. printf("%I64u ",temp2);
  69. }
Dream Walker...
离线yuzhou
只看该作者 7 发表于: 2007-11-16
很不错!顶!
离线xyj
只看该作者 8 发表于: 2008-01-06
这个~好像叫水仙花数or 阿姆斯特朗数吧~~
离线xyj
只看该作者 9 发表于: 2008-01-06
LZ的代码解释一下,看不大懂~
快速回复
限100 字节
 
上一个 下一个