设为首页收藏本站|繁體中文

Project1

 找回密码
 注册会员
搜索
查看: 8438|回复: 59
打印 上一主题 下一主题

[RMXP发布] 【丧心病狂】被玩坏的RMXP之一些计算和判定

[复制链接]

Lv4.逐梦者

梦石
0
星屑
9280
在线时间
2504 小时
注册时间
2011-5-20
帖子
15389

开拓者

跳转到指定楼层
1
发表于 2014-7-4 14:44:23 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式

加入我们,或者,欢迎回来。

您需要 登录 才可以下载或查看,没有帐号?注册会员

x
本帖最后由 chd114 于 2014-7-4 14:48 编辑

使用方法:按F11插入脚本编辑器MAIN前即可
声明:里面部分计算非楼主所做···所以请不要随意署名
@弗雷德 @P叔 @凌童鞋 @晴兰 ···顺便很无耻地@美丽晨露 @= =@hys111111

@myownroc

@tjjlb
我知道学生党一定会用到的···
RUBY 代码复制
  1. class Numeric
  2.   def mirrornumber # 颠倒数(镜像数)这个是自己起的名字···其实本来想参考必修3做个回文数的但是找不到了就做了个这个···
  3.     if self.abs != self
  4.       raise ArgumentError.new("NaN")
  5.     end
  6.     num=0
  7.     sn=[]
  8.     x=0
  9.     self_array = self.to_s.scan(/./) # 分割每一位上的数字
  10.     for char in self_array # 获取位数
  11.       sn[x]=char.to_i
  12.       x+=1
  13.     end
  14.     for i in 0...sn.size
  15.       num+=sn[sn.size-1-i]*10**(sn.size-1-i)
  16.     end
  17.     return num.truncate == num ? num.truncate : num
  18.   end
  19.  
  20.   def disnumber # 相反数
  21.     num=-self
  22.     return num.truncate == num ? num.truncate : num
  23.   end
  24.   def unnumber # 倒数
  25.     num=1.0/self
  26.     return num.truncate == num ? num.truncate : num
  27.   end
  28.   def prime(y) # 判定质数(y非0时必须用print,否则会p num => nil)
  29.     if self.abs != self
  30.       raise ArgumentError.new("NaN")
  31.     end
  32.     num=nil
  33.     if self==2
  34.       if y==0
  35.         num=1
  36.       else
  37.         num=self.to_s+"是质数"
  38.       end
  39.     end
  40.     if num==nil
  41.       i=2
  42.       r=self%i
  43.       until i>self-1 or r==0
  44.         r=self%i
  45.         i+=1
  46.       end
  47.       if y==0
  48.         if r==0
  49.           num=0
  50.         else
  51.           num=1
  52.         end
  53.       else
  54.         if r==0
  55.           num=self.to_s+"不是质数"
  56.         else
  57.           num=self.to_s+"是质数"
  58.         end
  59.       end
  60.     end
  61.     return num.to_s == num ? num.to_s : num
  62.   end
  63.   def zxgbs(y) # 标准的《九章算术》中先求最大公约数再求最小公倍数
  64.     num=nil
  65.     n=[self,y]
  66.     for i in 0...n.size
  67.       if n[i] <= 0
  68.         raise ArgumentError.new("NaN")
  69.       end
  70.     end
  71.     n=n.sort # 从小到大重新排序
  72.     if num==nil
  73.       i=n[0].cm2(n[1])
  74.       num=n[0]*n[1]/i
  75.     end
  76.     return num.to_s == num ? num.to_s : num
  77.   end
  78.   def cm1(y) # 辗转相除法求最大公约数(部分情况会失控)
  79.     n=[self,y]
  80.     for i in 0...n.size
  81.       if n[i] <= 0
  82.         raise ArgumentError.new("NaN")
  83.       end
  84.     end
  85.     n=n.sort # 从小到大重新排序
  86.     num=n[1]
  87.     i=num%n[0]
  88.     if i=0#余数为0时最大公约数为小的数
  89.       num=n[0]
  90.     else
  91.       while i!=0
  92.         num=n[0]
  93.         n[0]=i
  94.         i=num%n[0]
  95.       end
  96.     end
  97.     return num.to_s == num ? num.to_s : num
  98.   end
  99.   def cm2(y) # 更相损减术求最大公约数
  100.     n=[self,y]
  101.     for i in 0...n.size
  102.       if n[i] <= 0
  103.         raise ArgumentError.new("NaN")
  104.       end
  105.     end
  106.     i=1
  107.     if n[0]%2==0 and n[1]%2==0
  108.       n=[self/2,y/2]
  109.       i+=1
  110.     end
  111.     n=n.sort # 从小到大重新排序
  112.     num=n[1]-n[0]
  113.     if num==n[0] # 差等于减数时最大公约数为减数(差)
  114.       num=n[0]
  115.     else
  116.       while num!=n[0]
  117.         if n[0]>num
  118.           n=[num,n[0]]
  119.         else
  120.           n=[num,n[1]]
  121.         end
  122.         num=n[1]-n[0]
  123.       end
  124.     end
  125.     num*=i
  126.     return num.to_s == num ? num.to_s : num
  127.   end
  128.   # 一元N次N项式
  129.   def dxs1(y) # 逐项求
  130.     num=0
  131.     for i in 1..y.size
  132.       num+=y[i-1]*self**(y.size-i)
  133.     end
  134.     return num.truncate == num ? num.truncate : num
  135.   end
  136.   def dxs2(y) # 秦九韶算法
  137.     num=y[0]
  138.     for i in 1..y.size-1
  139.       num*=self
  140.       num+=y[i]
  141.     end
  142.     return num.truncate == num ? num.truncate : num
  143.   end
  144.   # 等差数列arithmetic_progression
  145.   def ari(x,y) # 等差数列求第y项
  146.     num=self+(y-1)*x
  147.   end
  148.   def arih1(x,y) # 等差数列已知首项self求前y项和
  149.     num=y*self+(y-1)*y*x/2
  150.   end
  151.   def arih2(x,y) # 等差数列已知末项self求前y项和
  152.     num=y*self-(y-1)*y*x/2
  153.   end
  154.   def arih3(x,y) # 等差数列已知首项x和末项y和元素数求和
  155.     num=self*(x+y)/2
  156.   end
  157.   # 等比数列geometric_sequence
  158.   def geo(x,y) # 等比数列求第y项
  159.     num=self*x**(y-1)
  160.     return num.truncate == num ? num.truncate : num
  161.   end
  162.   def geoh1(x,y) # 等比数列求前y项和
  163.     num=self # 获取a1
  164.     for i in 1...y
  165.       num+=x**(i) # 依次加上a2、a3...直到an
  166.     end
  167.     return num.truncate == num ? num.truncate : num
  168.   end
  169.   def geoh2(x,y) # 等比数列已知首项self求前y项和
  170.     num=(self*(1-x**y))/(1-x)
  171.     return num.truncate == num ? num.truncate : num
  172.   end
  173.   def geoh3(x,y) # 等比数列已知首项self和末项y求前y项和
  174.     num=(self-y*x)/(1-x)
  175.     return num.truncate == num ? num.truncate : num
  176.   end
  177.   def factorial # 阶乘
  178.     if self.abs != self
  179.       raise ArgumentError.new("NaN")
  180.     end
  181.     num=self
  182.     fnum=self
  183.     for i in 2...fnum # 乘数取1到阶乘基数本身之间的数
  184.       num*=i
  185.     end
  186.     return num.truncate == num ? num.truncate : num
  187.   end
  188.   def log(y) # 对数函数
  189.     if self.abs != self
  190.       raise ArgumentError.new("NaN")
  191.     end
  192.     x=self
  193.     num=1
  194.     while x!=y
  195.       x/=y
  196.       num+=1
  197.     end
  198.     return num.truncate == num ? num.truncate : num
  199.   end
  200.   def lg # 以10为底的对数函数
  201.     if self.abs != self
  202.       raise ArgumentError.new("NaN")
  203.     end
  204.     x=self
  205.     num=1
  206.     while x!=10
  207.       x/=10
  208.       num+=1
  209.     end
  210.     return num.truncate == num ? num.truncate : num
  211.   end
  212.   def sqr # 平方
  213.     return self ** 2
  214.   end
  215.   def cube # 立方
  216.     return self ** 3
  217.   end
  218.   def powten # 10 的 self 次方
  219.     return 10 ** self
  220.   end
  221.   def enf(y) # 任意次方
  222.     num = self ** y
  223.     return num.truncate == num ? num.truncate : num
  224.   end
  225.   def sqrt # 开平方
  226.     if self.abs != self
  227.       raise ArgumentError.new("NaN")
  228.     end
  229.     num = self ** 0.5
  230.     return num.truncate == num ? num.truncate : num
  231.   end
  232.   def cuberoot # 开立方
  233.     if self.abs != self
  234.       num = (self * (-1)) ** (1 / 3.0)
  235.       return num.truncate == num ? -num.truncate : -num
  236.     end
  237.     num = self ** (1 / 3.0)
  238.     return num.truncate == num ? num.truncate : num
  239.   end
  240.   def root(y) # 开任意次方
  241.     if self.abs != self and y % 2 == 0
  242.       raise ArgumentError.new("NaN")
  243.     end
  244.     if self.abs != self
  245.       num = (self * (-1)) ** (1.0 / y)
  246.       return num.truncate == num ? -num.truncate : -num
  247.     end
  248.     num = self ** (1.0 / y)
  249.     return num.truncate == num ? num.truncate : num
  250.   end
  251. end
  252. class Array
  253.   def average(need_dec = true) # 平均数 (是否使用浮点数)
  254.     if self.include?(nil)
  255.       ary = self.compact
  256.     else
  257.       ary = self
  258.     end
  259.     num = 0
  260.     if ary.size == 0
  261.       raise ZeroDivisionError.new("divided by 0")
  262.     end
  263.     for i in 0...ary.size
  264.       if ary[i].is_a?(Numeric)
  265.         num += ary[i]
  266.       else
  267.         raise TypeError.new("connot convert #{ary[i].class} into Numeric")
  268.       end
  269.     end
  270.     num /= ary.size.to_f
  271.     unless need_dec
  272.       return num.truncate
  273.     end
  274.     return num.truncate == num ? num.truncate : num
  275.   end
  276.   def variance(need_dec = true) # 方差
  277.     if self.include?(nil)
  278.       ary = self.compact
  279.     else
  280.       ary = self
  281.     end
  282.     num = 0
  283.     average=ary.average.to_f
  284.     for i in 0...ary.size
  285.       num+=((ary[i]-average)**2).to_f
  286.     end
  287.     num=(num/ary.size).to_f
  288.   end
  289.   def deviation(need_dec = true) # 标准差
  290.     if self.include?(nil)
  291.       ary = self.compact
  292.     else
  293.       ary = self
  294.     end
  295.     num = 0
  296.     num=((ary.variance.to_f)**0.5).to_f # 标准差是方差的算术平方根
  297.   end
  298.   def range(need_dec = true) # 极差(是否使用浮点数)
  299.     if self.include?(nil)
  300.       ary = self.compact
  301.     else
  302.       ary = self
  303.     end
  304.     num = 0
  305.     if ary.size == 0
  306.       raise ZeroDivisionError.new("divided by 0")
  307.     end
  308.     num = (ary.max-ary.min).to_f
  309.     unless need_dec
  310.       return num.truncate
  311.     end
  312.     return num.truncate == num ? num.truncate : num
  313.   end
  314.   def median(need_dec = true) # 中位数(是否使用浮点数)(需要从小到大排列)
  315.     if self.include?(nil)
  316.       ary = self.compact
  317.     else
  318.       ary = self
  319.     end
  320.     num = 0
  321.     ary=ary.sort # 从小到大重新排序
  322.     if ary.size == 0
  323.       raise ZeroDivisionError.new("divided by 0")
  324.     end
  325.     if ary.size%2==1
  326.       num = ary[ary.size/2].to_f
  327.     elsif ary.size%2==0
  328.       num = (ary[(ary.size-1)/2+1]+ary[(ary.size+1)/2-1])/2.to_f
  329.     end
  330.     unless need_dec
  331.       return num.truncate
  332.     end
  333.     return num.truncate == num ? num.truncate : num
  334.   end
  335.   def mode(need_dec = true) # 众数(是否使用浮点数)
  336.     if self.include?(nil)
  337.       ary = self.compact
  338.     else
  339.       ary = self
  340.     end
  341.     num = 0
  342.     if ary.size == 0
  343.       raise ZeroDivisionError.new("divided by 0")
  344.     end
  345.     modenum=[]
  346.     ary=ary.sort # 从小到大重新排序
  347.     for i in 0...ary.size # 计算每个数出现的次数
  348.       if ary[i].is_a?(Numeric)
  349.         if modenum[ary[i]]==nil
  350.           modenum[ary[i]]=1
  351.         else
  352.           modenum[ary[i]]+=1
  353.         end
  354.       else
  355.         raise TypeError.new("connot convert #{ary[i].class} into Numeric")
  356.       end
  357.     end
  358.     for i in 0...modenum.size # 填充数组nil元素
  359.       if modenum[i]==nil
  360.         modenum[i]=0
  361.       end
  362.     end
  363.     modemax=modenum.max # 找出最大的数
  364.     for i in 0...modenum.size # 找出最大的数的所在位置
  365.       if modemax==modenum[i]
  366.         num=i
  367.       end
  368.     end
  369.     unless need_dec
  370.       return num.truncate
  371.     end
  372.     return num.truncate == num ? num.truncate : num
  373.   end
  374.  
  375. end



另外lg和log函数楼主做的感觉有问题···
[img]http://service.t.sina.com.cn/widget/qmd/5339802982/c02e16bd/7.png

Lv5.捕梦者 (管理员)

老黄鸡

梦石
0
星屑
42506
在线时间
7607 小时
注册时间
2009-7-6
帖子
13506

开拓者贵宾

2
发表于 2014-7-4 16:28:02 手机端发表。 | 只看该作者
最多100行,不特意缩短行数,完成lz所有功能,这样根本不是在写ruby。
回复 支持 反对

使用道具 举报

Lv4.逐梦者

梦石
0
星屑
9280
在线时间
2504 小时
注册时间
2011-5-20
帖子
15389

开拓者

3
 楼主| 发表于 2014-7-4 16:30:18 | 只看该作者
fux2 发表于 2014-7-4 16:28
最多100行,不特意缩短行数,完成lz所有功能,这样根本不是在写ruby。

什么最多100行···
[img]http://service.t.sina.com.cn/widget/qmd/5339802982/c02e16bd/7.png
回复 支持 反对

使用道具 举报

Lv4.逐梦者 (版主)

梦石
0
星屑
9532
在线时间
5073 小时
注册时间
2013-6-21
帖子
3580

开拓者贵宾剧作品鉴家

4
发表于 2014-7-4 16:30:49 | 只看该作者
感觉有些地方有问题,就当是对一些算法的练习吧。其实有些东西Math模块里就有吧应该。

1.有些东西着实不应该定义成Numeric类的普通方法,用起来感觉略微奇怪,比方说等差数列等比数列那个。
2.你这个log是给整数使的?这可不好。那定义在Numeric里面是啥意思呢?对于实数的log算法,我才不告诉你呢~
3.0的阶乘为什么不写进去?
4.求众数个人以为用Hash收集比较好吧。

点评

我文科···老师完全没提到阶乘···所以数学很多我完全自学···以至于现在数学我只能自己摸索···因为老师讲的完全懂了···数学现在是一直没下过年级前五   发表于 2014-7-4 16:42
楼主就是在逗你不用管他~  发表于 2014-7-4 16:40
累啊,不想动~  发表于 2014-7-4 16:39
快点写教程去啦(死  发表于 2014-7-4 16:37
回复 支持 反对

使用道具 举报

Lv3.寻梦者 (版主)

…あたしは天使なんかじゃないわ

梦石
0
星屑
2208
在线时间
4033 小时
注册时间
2010-10-4
帖子
10779

开拓者贵宾

5
发表于 2014-7-4 16:36:46 | 只看该作者
chd114 发表于 2014-7-4 16:30
什么最多100行···

100行代码完成楼主的所有功能
回复 支持 反对

使用道具 举报

Lv4.逐梦者

梦石
0
星屑
9280
在线时间
2504 小时
注册时间
2011-5-20
帖子
15389

开拓者

6
 楼主| 发表于 2014-7-4 16:38:13 | 只看该作者
RyanBern 发表于 2014-7-4 16:30
感觉有些地方有问题,就当是对一些算法的练习吧。其实有些东西Math模块里就有吧应该。

1.有些东西着实不应 ...

就是家里断网的时候练着玩的···然后觉着有些纯新手不知道Math是可以用的就发了···0的阶乘我不清楚···阶乘老实说老师还没教我是自己摸索的···负数没阶乘也是后来才知道

点评

Math.gamma(n) 走好。要精确的算整数就 (1..n).inject(:*)  发表于 2014-7-4 16:43
规定0!=1,这个你们老师没讲?  发表于 2014-7-4 16:40
[img]http://service.t.sina.com.cn/widget/qmd/5339802982/c02e16bd/7.png
回复 支持 反对

使用道具 举报

Lv4.逐梦者

梦石
0
星屑
9280
在线时间
2504 小时
注册时间
2011-5-20
帖子
15389

开拓者

7
 楼主| 发表于 2014-7-4 16:40:23 | 只看该作者
taroxd 发表于 2014-7-4 16:36
100行代码完成楼主的所有功能

比如哪些可以精简的?
[img]http://service.t.sina.com.cn/widget/qmd/5339802982/c02e16bd/7.png
回复 支持 反对

使用道具 举报

Lv3.寻梦者 (版主)

…あたしは天使なんかじゃないわ

梦石
0
星屑
2208
在线时间
4033 小时
注册时间
2010-10-4
帖子
10779

开拓者贵宾

8
发表于 2014-7-4 16:42:08 | 只看该作者
chd114 发表于 2014-7-4 16:40
比如哪些可以精简的?

从头到尾没有不能精简的地方
回复 支持 反对

使用道具 举报

Lv4.逐梦者

梦石
0
星屑
9280
在线时间
2504 小时
注册时间
2011-5-20
帖子
15389

开拓者

9
 楼主| 发表于 2014-7-4 16:42:56 | 只看该作者
taroxd 发表于 2014-7-4 16:42
从头到尾没有不能精简的地方

···return num.truncate == num ? num.truncate : num这一句?
[img]http://service.t.sina.com.cn/widget/qmd/5339802982/c02e16bd/7.png
回复 支持 反对

使用道具 举报

Lv3.寻梦者 (版主)

…あたしは天使なんかじゃないわ

梦石
0
星屑
2208
在线时间
4033 小时
注册时间
2010-10-4
帖子
10779

开拓者贵宾

10
发表于 2014-7-4 16:44:11 | 只看该作者
chd114 发表于 2014-7-4 16:42
···return num.truncate == num ? num.truncate : num这一句?

375行代码中的每一行都可以精简
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册会员

本版积分规则

拿上你的纸笔,建造一个属于你的梦想世界,加入吧。
 注册会员
找回密码

站长信箱:[email protected]|手机版|小黑屋|无图版|Project1游戏制作

GMT+8, 2024-12-2 06:31

Powered by Discuz! X3.1

© 2001-2013 Comsenz Inc.

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