新手刚学写了一小段

新手刚学写了一小段

是完成计算素数和数的真因子的
写的不好,大家表笑
class Test1<Test
#初始化
def initialize(n=1,m=1)
  super
  @@pa_flag=2
  @@pa_array=[]
  @@pa_array_temp=[]
 end
#判读数是不是素数 
 def primenum(n=@t1)
  @pn_i=0
  @pn_loop=n
  @pn_result=true
  if 2>@pn_loop then @pn_result=false end
  if @pn_loop.to_i!=@pn_loop then @pn_result=false end
  if @pn_result!=false and 2!=@pn_loop
  
  for @pn_i in (2..(@pn_loop-1))
   if @pn_loop % @pn_i ==0
    @pn_result=false
    break
   end
  end
  end
  @pn_result
 end
#计算一个比n小的全部素数并放入@@pa_array类变量

 def primearray(n=@t1)
  @pa_flag_local=-1
  @pa_i=0
  @pa_loop=n
  if @@pa_flag<2 then @@pa_flag=2 end
  if @@pa_flag<@pa_loop
  @pa_flag_local=@@pa_array.length-1
  end
  for @pa_i in @@pa_flag..@pa_loop
  if primenum(@pa_i)==true
   @@pa_array[@pa_flag_local=@pa_flag_local+1]=@pa_i
  end
 end
  @@pa_flag=@pa_loop
  @@pa_array.sort!
  @@pa_array.uniq!
 end
 #计算n的真因子
 def factor(n=@t1)
  @factor_list=[1]
  @factor_i=0
  @factor_flag=-1
  @factor_temp=n
  @factor_loop=n
  if @factor_loop>1 and @factor_loop.to_i==@factor_loop
  primearray(@factor_loop)
  @factor_flag=0
  while 1!=@factor_temp
   @factor_i=0
   for @factor_i in 0..@@pa_array[@@pa_array.length-1]
    if @factor_temp % @@pa_array[@factor_i]==0
    @factor_temp/=@@pa_array[@factor_i]
    @factor_list[@factor_flag=@factor_flag+1]=@@pa_array[@factor_i]
    break
    end
   end
  end
  else
  if @factor_loop==1
   @factor_list=[1]
  else
   @factor_list=[-1]
  end
  end
  @factor_list
 end
end

用父类占沙发
class Test
 def initialize(n=1,m=1)
  @t1=n
  @t2=m
 end
 def max
  if @t1>@t2 
   @max=@t1
   else
    @max=@t2
   end
   @max
 end
 def min
  if @t1<@t2 
  @min=@t1
  else
   @min=@t2
  end
  @min
 end 
 def gcd([email=m=@t1,n=@t2]m=@t1,n=@t2[/email])
  @gcd_a=m
  @gcd_b=n
  @gcd_r=0
  if @gcd_a< @gcd_b
  @gcd_a,@gcd_b=@gcd_b,@gcd_a
  end
  while
  @gcd_r = @gcd_a % @gcd_b
  if @gcd_r == 0 then break end
  @gcd_a = @gcd_b
  @gcd_b = @gcd_r
  end
  @gcd_b
 end
 def lcm([email=m=@t1,n=@t2]m=@t1,n=@t2[/email])
  @lcm_a=m
  @lcm_b=n
  @lcm_c=gcd
  @lcm_a*@lcm_b/@lcm_c
 end 
end
晕倒。好长好长的代码。应该是很认真花了很多心血的吧,呵呵。

不过你写的这段代码不像是ruby代码,更像是用C写出来的。建议去看看ruby的入门书,在下载区有很多书籍可以下载。Ruby的代码应该是简洁明了的,其它语言用n条语句才能实现的东西,用Ruby来实现只需要几句,而且是语意明显的几句话。

代码最大的问题就用了太多的类变量和实例变量,其实大部分都可以用局部变量。还有很多代码也太罗嗦了。

例如得到两个数其中较大和较小的只要一句代码就OK了:

[Copy to clipboard] [ - ]
给你一个求素数的例子:

[Copy to clipboard] [ - ]
嗯,Ruby的精髓就在于动态,要尽量理解并运用这点。
满眼的@和@@让人心烦
如果不用从外部访问那些变量,且不用作对象的属性的话,普通变量就够用了

可以参考一下这里:
http://www.ruby-lang.org.cn/forums/thread-704-1-2.html
还有
%rubyroot%\lib\ruby\1.8\mathn.rb里面从45行开始的prime_division方法

[ 本帖最后由 xavier 于 2007-11-13 14:02 编辑 ]