wayne 发表于 2010-8-27 14:25:48

10# chyanog
你这样还是涉及到了计算。其实回文数的产生根本不涉及计算。直接摆数字就是了

wayne 发表于 2010-8-27 14:33:20

f := FromDigits@Join, Reverse]]
g := FromDigits@Join, Reverse, {-1}]]]
palindrome := If, f[#], g[#]] & /@ Range - 1), 10^(Ceiling) - 1]palindrome 表示输出所有的五位数

chyanog 发表于 2010-8-27 14:44:25

12# wayne
版主的方法的确妙。不过根据我的测试:
当n等于9时:
我的方法:
Flatten@Table[{100000001, 10000010, 1000100, 101000, 10000}.{a, b, c,
      d, e}, {a, 9}, {b, 0, 9}, {c, 0, 9}, {d, 0, 9}, {e, 0,
   9}]; // Timing
不过0.06s,你的方法却需要1.2s
不知道你的方法如果用C来写难度大否

chyanog 发表于 2010-8-27 14:51:06

我的方法不太容易写成一个通用的函数,估计应该可以,你不妨试试。
你的方法实现起来并没有预计的快,也许是Mathematica的缘故吧,因为所用函数都是封装好的又不够底层

wayne 发表于 2010-8-27 14:53:58

13# chyanog

我的代码只是演示一下我的意思,根本不是计算问题,而是数字的排列组合问题:
决定n位回文数的数字也就只需看它的前Ceiling位数。而且这个前Ceiling位的数字 其实就是所有的Ceiling位数。
我的效率是有点低,应该低在反复拆数字,合并数字上

wayne 发表于 2010-8-27 14:58:18

回文数字的产生太简单了,真没啥好研究的。
你还没发现吗,如果 你要产生五位数,只需先顺此打印出所有的三位数,打印的时候注意顺便在末尾添加首两位的数字的倒序即可,........

研究通项公式倒还不错。

chyanog 发表于 2010-8-27 14:58:26

15# wayne
如果把FromDigits换成Row的话,根据我的测试,所用CPU时间会有所减少,palindrome由原来的1.2s减为0.9s,可惜这样产生的数字只能看,并不能参与运算!

chyanog 发表于 2010-8-27 15:04:40

16# wayne
不过好多初级的程序设计书上面常常见到关于回文数算法,方法算还不少,高效的却未必多。
可是有关回文数通项公式却找不到相关资料,咱论坛里除了你大家都似乎没有在意。而我的数学水平只是相当与一般高中生而已,进入末流大专后学的网络编程,数学基本没有再学到什么

chyanog 发表于 2010-8-27 15:08:22

版主不妨再回顾一下Project Euler第4题。
http://forum.simwe.com/viewthread.php?tid=858417&extra=page%3D1%26amp;filter%3Dtype%26amp;typeid%3D508
看看还能不能来得更高效

wayne 发表于 2010-8-27 15:19:20

13# chyanog
C代码,:lol#include<stdio.h>
int main(){
int i=0;
for(i=100;i<1000;i++)
printf("%d%d%d%d\t",i,i%10,(i/10)%10,i/100);
return 0;
}
页: 1 [2] 3
查看完整版本: 回文数通项公式