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

[讨论] 回文数通项公式

[复制链接]
发表于 2010-8-27 14:25:48 | 显示全部楼层
10# chyanog
你这样还是涉及到了计算。其实回文数的产生根本不涉及计算。直接摆数字就是了
毋因群疑而阻独见  毋任己意而废人言
毋私小惠而伤大体  毋借公论以快私情
发表于 2010-8-27 14:33:20 | 显示全部楼层
  1. f[n_] := FromDigits@Join[IntegerDigits[n], Reverse[IntegerDigits[n]]]
  2. g[n_] := FromDigits@Join[IntegerDigits[n], Reverse[Drop[IntegerDigits[n], {-1}]]]
  3. palindrome[n_] := If[EvenQ[n], f[#], g[#]] & /@ Range[10^(Ceiling[n/2] - 1), 10^(Ceiling[n/2]) - 1]
复制代码
palindrome[5] 表示输出所有的五位数
毋因群疑而阻独见  毋任己意而废人言
毋私小惠而伤大体  毋借公论以快私情
 楼主| 发表于 2010-8-27 14:44:25 | 显示全部楼层
12# wayne
版主的方法的确妙。不过根据我的测试:
当n等于9时:
我的方法:

  1. Flatten@Table[{100000001, 10000010, 1000100, 101000, 10000}.{a, b, c,
  2.       d, e}, {a, 9}, {b, 0, 9}, {c, 0, 9}, {d, 0, 9}, {e, 0,
  3.      9}]; // Timing
复制代码
不过0.06s,你的方法却需要1.2s
不知道你的方法如果用C来写难度大否
毋因群疑而阻独见  毋任己意而废人言
毋私小惠而伤大体  毋借公论以快私情
 楼主| 发表于 2010-8-27 14:51:06 | 显示全部楼层
我的方法不太容易写成一个通用的函数,估计应该可以,你不妨试试。
你的方法实现起来并没有预计的快,也许是Mathematica的缘故吧,因为所用函数都是封装好的又不够底层
毋因群疑而阻独见  毋任己意而废人言
毋私小惠而伤大体  毋借公论以快私情
发表于 2010-8-27 14:53:58 | 显示全部楼层
13# chyanog

我的代码只是演示一下我的意思,根本不是计算问题,而是数字的排列组合问题:
决定n位回文数的数字也就只需看它的前Ceiling[n/2]位数。而且这个前Ceiling[n/2]位的数字 其实就是所有的Ceiling[n/2]位数。
我的效率是有点低,应该低在反复拆数字,合并数字上
毋因群疑而阻独见  毋任己意而废人言
毋私小惠而伤大体  毋借公论以快私情
发表于 2010-8-27 14:58:18 | 显示全部楼层
回文数字的产生太简单了,真没啥好研究的。
你还没发现吗,如果 你要产生五位数,只需先顺此打印出所有的三位数,打印的时候注意顺便在末尾添加首两位的数字的倒序即可,........

研究通项公式倒还不错。
毋因群疑而阻独见  毋任己意而废人言
毋私小惠而伤大体  毋借公论以快私情
 楼主| 发表于 2010-8-27 14:58:26 | 显示全部楼层
15# wayne
如果把FromDigits换成Row的话,根据我的测试,所用CPU时间会有所减少,palindrome[9]由原来的1.2s减为0.9s,可惜这样产生的数字只能看,并不能参与运算!
毋因群疑而阻独见  毋任己意而废人言
毋私小惠而伤大体  毋借公论以快私情
 楼主| 发表于 2010-8-27 15:04:40 | 显示全部楼层
16# wayne
不过好多初级的程序设计书上面常常见到关于回文数算法,方法算还不少,高效的却未必多。
可是有关回文数通项公式却找不到相关资料,咱论坛里除了你大家都似乎没有在意。而我的数学水平只是相当与一般高中生而已,进入末流大专后学的网络编程,数学基本没有再学到什么
毋因群疑而阻独见  毋任己意而废人言
毋私小惠而伤大体  毋借公论以快私情
 楼主| 发表于 2010-8-27 15:08:22 | 显示全部楼层
版主不妨再回顾一下Project Euler第4题。
http://forum.simwe.com/viewthrea ... %26amp;typeid%3D508
看看还能不能来得更高效
毋因群疑而阻独见  毋任己意而废人言
毋私小惠而伤大体  毋借公论以快私情
发表于 2010-8-27 15:19:20 | 显示全部楼层
13# chyanog
C代码,
  1. #include<stdio.h>
  2. int main(){
  3. int i=0;
  4. for(i=100;i<1000;i++)
  5. printf("%d%d%d%d\t",i,i%10,(i/10)%10,i/100);
  6. return 0;
  7. }
复制代码
毋因群疑而阻独见  毋任己意而废人言
毋私小惠而伤大体  毋借公论以快私情
您需要登录后才可以回帖 登录 | 欢迎注册

本版积分规则

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

GMT+8, 2024-5-19 01:33 , Processed in 0.043894 second(s), 15 queries .

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

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