找回密码
 立即注册

QQ登录

只需一步,快速开始

扫一扫,访问微社区

楼主: ynhh

[求助] 在不同CAD版本中相同算式为何结果不同?

[复制链接]

已领礼包: 20个

财富等级: 恭喜发财

发表于 2017-3-29 16:21:52 | 显示全部楼层

你说的这个就是同余定理,网上搜索下有很多资料

1.同余定理:(a+b)%c=((a%c)+(b%c))%c

m%n举例:

123 % n =(((1%n*10%n+2%n)%n*10%n)%n+3%n)%n

利用这个性质我们可以将大整数按位分解存入数组,然后循环求出最终余数。


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

使用道具 举报

已领礼包: 6881个

财富等级: 富甲天下

 楼主| 发表于 2017-3-29 17:09:51 | 显示全部楼层

谢谢你的指点因无法用计算器等验证
因与AUTOCAD计算的结果都不同

请你看看这个对不对?
http://bbs.mjtd.com/thread-174967-1-1.html

  • 0.jpg (defun lrem (snum mod / r)
  • 1.jpg   (while (/= "" snum)
  • 2.jpg     (setq r    (rem (atoi (substr snum 1 9)) mod)
  • 3.jpg     snum (substr snum 10 (- (strlen snum) 9))
  • 4.jpg     snum (strcat (itoa r) snum)
  • 5.jpg     )
  • 6.jpg     (if (< (atoi snum) mod) (setq snum ""))
  • 7.jpg   )
  • 8.jpg   r
  • 9.jpg )



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

使用道具 举报

已领礼包: 40个

财富等级: 招财进宝

发表于 2017-3-29 21:01:13 | 显示全部楼层

下面是根据 同余定理写的 超大整数求余数

  1. (defun XD::Math:Rem (a b / str i m)
  2.   (defun _isint (str)
  3.     (setq c (mapcar '(lambda (x) (- x 48)) (vl-string->list str)))
  4.     (if (vl-some '(lambda (x) (> x 9)) c)
  5.       nil
  6.       c
  7.     )
  8.   )
  9.   (cond
  10.     ((= (type a) 'INT)
  11.      (setq str (itoa a))
  12.     )
  13.     ((= (type a) 'REAL)
  14.      (setq str (rtos a))
  15.     )
  16.     ((= (type a) 'STR)
  17.      (setq str a)
  18.     )
  19.   )
  20.   (if (and str (setq str (_isint str)))
  21.     (progn
  22.       (setq
  23.         i 0
  24.         m 0
  25.       )
  26.       (repeat (length str)
  27.         (setq m (rem (+ (* 10 (rem m b)) (rem (nth i str) b)) b))
  28.         (setq i (1+ i))
  29.       )
  30.     )
  31.   )
  32.   m
  33. )



命令: (xd::math:rem "20107019021211566" 56789)
51449


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

使用道具 举报

已领礼包: 6881个

财富等级: 富甲天下

 楼主| 发表于 2017-3-29 21:43:07 | 显示全部楼层

感谢版主

(defun lrem (snum mod / r)
    (while (/= "" snum)
      (setq r    (rem (atoi (substr snum 1 9)) mod)
      snum (substr snum 10 (- (strlen snum) 9))
      snum (strcat (itoa r) snum)
      )
      (if (< (atoi snum) mod) (setq snum ""))
    )
    r
  )

这个据说可计算到32位
不知版主这个有没有可计算到多少位的说法
经对比结果是一样的
但这个感觉是不是更精简一些啊

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

使用道具 举报

已领礼包: 40个

财富等级: 招财进宝

发表于 2017-3-29 21:49:21 | 显示全部楼层

精简代码就几行,给你多的,是判断了你输入的字符串是否是数字组成的,和输入字符串,整数,实数都能给你算。
你贴的那个代码没这些功能。

输入的参数不符合就出错了,比如你输入了 "123a32" 是要出错的。

精简的代码,就几行。下面的代码就没纠错功能了,而且只能算字符串整数
  1. (defun lrem (a b / i m c)
  2.   (setq c (mapcar '(lambda (x) (- x 48)) (vl-string->list a)))
  3.   (setq i 0 m 0)
  4.   (repeat (length c)
  5.     (setq m (rem (+ (* 10 (rem m b)) (rem (nth i c) b)) b))
  6.     (setq i (1+ i))
  7.   )
  8.   m
  9. )




多少位都行,没限制。下面是42位的。

命令: (lrem "123456789123456789012345678912345678901235" 56789)
15992

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

使用道具 举报

已领礼包: 6881个

财富等级: 富甲天下

 楼主| 发表于 2017-3-29 22:12:23 | 显示全部楼层

感谢版主的细致讲解
你高精的技术,宽广的情怀
是晓东战无不胜的力量
衷心感谢晓东
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-9-27 12:30 , Processed in 0.276809 second(s), 38 queries , Gzip On.

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

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