找回密码
 立即注册

QQ登录

只需一步,快速开始

扫一扫,访问微社区

楼主: xyp1964

[转贴]:和尚与馒头问题

[复制链接]
发表于 2005-10-13 07:47:51 | 显示全部楼层
狂刀兄分析的很好
我也谈谈个人的一些小看法
碰到这个问题的时候,我想也不想的就编了4楼的程序
大概花2分钟,计算用3秒
我的思路是,硬算,这个可能是高手所不齿的,不过花的总时间最短
不过这样子遇到更大的问题有可能速度的平方增长的
所以,假如问题重复遇到的话,就必须研究算法

对于xyp版主提出的和尚馒头和字母求和.现在的感觉就是
利用一些简单的数学知识,可以大大减小计算时间

其实这道不定方程,就是
3X+2Y+Z/3=100  (1)
X+Y+Z=100      (2)
的正整数解

(2)*3-(1) 得到Y+8Z/3=200,这个表明Y可以用Z表示,

所以只要对Z进行+3循环,就可以依次得到Y值,按X=100-Y-Z,判断X是否正数,代入式子(1)看对否
这种应该就是一次循环吧

要是象狂刀兄缩小范围就更快了

初步感觉:
这种m个未知数和n个方程的,有无穷多解的,
(大概是线性代数中讲的非满秩相容线性方程组吧,不大记得了)
加上正整数之类的就是约束

假如m和n的数目相等的时候,肯定就可以用什么高斯消元法来作

假如m>n的时候,感觉最小的循环次数应该是m-n
比如4个未知数W X Y Z , 2个方程
那么只能化到W+X+Y=?,
此时的循环次数应该是4-2=2
需对X和Y循环得到W,再代入原始两条方程验算

学到了不少东西,不如以后编些经典题目,比如8皇后问题啊,华容道啊什么的:)
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

发表于 2005-10-13 09:48:46 | 显示全部楼层
学习
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 2个

财富等级: 恭喜发财

发表于 2005-10-13 11:30:07 | 显示全部楼层
15楼的论述中,所表达的思想很好,看了后很有启示。
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 488个

财富等级: 日进斗金

发表于 2005-10-13 18:57:23 | 显示全部楼层
你的测试是不是太夸张了?
不要太自信了!

(while (<= (/ x 3) 100)
----就是我的repeat 33

(while (< (setq b (+ x x x y y)) 100)
---就是(repeat (/(- 100(* 3 x))2)

难道有什么错吗?
而且应该是repeat更快一些



  1. (defun c:test( / x y z lst j)
  2. (setq x 0 j 0.)
  3. (repeat 33   ;大和尚
  4.   (setq y 0)
  5.   (setq lst(cons (/(- 100(* 3 x))2) lst))
  6.   (repeat (/(- 100(* 3 x))2);中和尚
  7.     (setq j(+ 1 j))
  8.     (if(and(setq z(- 100 x x x y y)) ;小和尚的馒头
  9.            (= 100(+ x y(* z 3)))
  10.         )
  11.        (mapcar 'princ(list "\n大中小分别是: " x "; " y "; "(* z 3)))
  12.     )
  13.     (setq y(1+ y))
  14.   )(setq x(1+ x))
  15. )
  16. (princ(strcat "\n次数"(rtos j 2 10)))(princ)
  17. )

850次


  1. (defun c:xx (/ t1 x y z b d t2 h m s j)
  2.   (setq j 0.)
  3.   (setq x 0)
  4.   (while (<= x 33)
  5.     (setq y 0)
  6.     (while (< (setq b (+ x x x y y)) 100)
  7.       (setq j(+ j 1))
  8.       (setq z (- 100 x y))
  9.       (if (and (= 0 (rem z 3))
  10.                (= 100 (+ b (/ z 3))))
  11.           (mapcar 'princ (list "\n大和尚=" x " ; " "中和尚=" y " ; " "小和尚=" z))
  12.       )
  13.       (setq y (1+ y))
  14.      )
  15.     (setq x (1+ x))
  16.   )
  17.    
  18.   (princ(strcat "\n"(rtos j 2 10)))(princ)
  19. )

867次
其他地方速度不论,看次数就知道.

我上次是把表里的相乘了,其实应该相加.
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

发表于 2005-10-13 20:47:14 | 显示全部楼层
aeo版主先别着急,你没有看完我的15贴,15贴里面是另外一个程序:)!
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 593个

财富等级: 财运亨通

发表于 2005-10-13 21:33:53 | 显示全部楼层
执行程序前先 (gc)
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

发表于 2005-11-21 11:48:32 | 显示全部楼层
佩服各位的探索精神
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

发表于 2005-11-21 18:55:46 | 显示全部楼层
比的精度已经不够体现,建议统一时间函数,用到纳秒级。还要统一提示和输出格式,才公平。呵呵.
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 1个

财富等级: 恭喜发财

发表于 2005-11-21 23:36:28 | 显示全部楼层
不公平啊,运行的时间与电脑的配置有关系吧。P3的和P4的肯定相差较大。
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

 楼主| 发表于 2005-11-22 15:01:44 | 显示全部楼层
最初由 yxpxa 发布
[B]不公平啊,运行的时间与电脑的配置有关系吧。P3的和P4的肯定相差较大。 [/B]

跑得再慢,百米速度比世界记录也不过差几秒!呵呵……
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

发表于 2005-12-10 09:01:04 | 显示全部楼层
其实斑竹提出此问题的真正用意是关于此问题的算法思想,而不是程序的执行时间问题,现在的电脑配置都比较高了,谁会在乎几秒的等待时间?
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

发表于 2005-12-10 19:19:29 | 显示全部楼层
显示时间可以用这个函数,简捷
(princ (menucmd (strcat "M=$(edtime," (rtos (- t2 t1)2 16)  ",HH:MM:SS:MSEC)")))
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

发表于 2005-12-10 19:28:30 | 显示全部楼层
我还以为什么轻松话题呢?
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

发表于 2005-12-22 20:48:29 | 显示全部楼层
敬业的老师
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

发表于 2005-12-23 18:44:27 | 显示全部楼层
谈的真多阿,我都看累了
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|申请友链|Archiver|手机版|小黑屋|辽公网安备|晓东CAD家园 ( 辽ICP备15016793号 )

GMT+8, 2024-11-23 05:58 , Processed in 0.209588 second(s), 53 queries , Gzip On.

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

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