Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/335.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在ruby中检查素数_Ruby_Square Root - Fatal编程技术网

在ruby中检查素数

在ruby中检查素数,ruby,square-root,Ruby,Square Root,我正在尝试编写一个方法,它接受一个数字并检查它是否是素数。在做了一些研究之后,一种快速的检查方法是将数字除以2和sqrt(我们正在检查的数字)之间的每个数字。如果是素数,我希望我的方法返回true,如果不是,则返回false 所以我试着编写对我来说合乎逻辑的代码,但我得到了一个错误。以下是我写的: def PrimeTime(num) counter = 2 while counter <= Math.sqrt(num).ceil (counter == M

我正在尝试编写一个方法,它接受一个数字并检查它是否是素数。在做了一些研究之后,一种快速的检查方法是将数字除以2和sqrt(我们正在检查的数字)之间的每个数字。如果是素数,我希望我的方法返回true,如果不是,则返回false

所以我试着编写对我来说合乎逻辑的代码,但我得到了一个错误。以下是我写的:

def PrimeTime(num)
    counter = 2
    while counter <= Math.sqrt(num).ceil
        (counter == Math.sqrt(num).ceil) ? "false"
        (num % counter == 0) ? "true" : counter += 1
    end
end
重写代码

def prime?(num)
    (2..Math.sqrt(num).ceil).to_a.each do |number|
        if num % number == 0
            return false
        else
            return true
        end
    end
end 

仅供参考,这不是家庭作业。我正在经历红细胞的问题。感谢您的帮助

您面临的最直接的问题是,这不是有效的Ruby:
(counter==Math.sqrt(num.ceil)?“假”

作为运算符,是三元运算符的一部分,并始终与
成对出现,当您在下一行中写入时。此外,过度使用三元运算符也是不好的。控制流也有问题:在计算
“true”
之后,循环将继续,
计数器不会改变,并且您得到了一个无限循环


我建议你算出算法应该是什么。如有必要,用英语写。然后确保正确地将其转换为Ruby

此外,Ruby方法应该使用snake大小写(小写,单词之间带下划线),因此
PrimeTime
不是一个好名字。如果要返回布尔值(
true
false
),我建议使用
prime?
(标识符中也允许使用问号)。如果您正在返回一个字符串(正如您似乎正在尝试的那样),请尝试
检查\u的素性
或类似的操作(不带问号)

还有。。。如果余数为零,则该数字不是素数。我想你的测试已经改变了

如果您仍然感到困惑:

def prime?(num);(2..Math.sqrt(num))。每个do |计数器|;如果(num%计数器==0);返回假结束;是的;结束

编辑重写的代码:
中断并返回false
不会执行您想要的操作。它们都是控制语句;如果您
中断
返回
将不会发生。即使是这样,如果没有中断,写
,或者至少写
&&
,而不是
&
(二进制和)


您的逻辑仍然是错误的:
PrimeTime(16)
true
,例如,它并不是我所期望的素性测试函数。

您面临的最直接的问题是,这不是有效的Ruby:
(counter==Math.sqrt(num.ceil))?“假”

作为运算符,是三元运算符的一部分,并始终与
成对出现,当您在下一行中写入时。此外,过度使用三元运算符也是不好的。控制流也有问题:在计算
“true”
之后,循环将继续,
计数器不会改变,并且您得到了一个无限循环


我建议你算出算法应该是什么。如有必要,用英语写。然后确保正确地将其转换为Ruby

此外,Ruby方法应该使用snake大小写(小写,单词之间带下划线),因此
PrimeTime
不是一个好名字。如果要返回布尔值(
true
false
),我建议使用
prime?
(标识符中也允许使用问号)。如果您正在返回一个字符串(正如您似乎正在尝试的那样),请尝试
检查\u的素性
或类似的操作(不带问号)

还有。。。如果余数为零,则该数字不是素数。我想你的测试已经改变了

如果您仍然感到困惑:

def prime?(num);(2..Math.sqrt(num))。每个do |计数器|;如果(num%计数器==0);返回假结束;是的;结束

编辑重写的代码:
中断并返回false
不会执行您想要的操作。它们都是控制语句;如果您
中断
返回
将不会发生。即使是这样,如果没有中断,写
,或者至少写
&&
,而不是
&
(二进制和)


但是,您的逻辑仍然是错误的:
PrimeTime(16)
真的
,例如,这并不是我期望从素性测试函数中得到的结果。

在我看来,您使这种方法比它应该的更复杂。下面是我建议使用的代码

require 'prime'

puts 2.prime?
就这么简单。如果你想用自己的方法

require 'prime'

def prime?(num)
    num.prime?
end

在我看来,你让这条路变得比它应该的更复杂。下面是我建议使用的代码

require 'prime'

puts 2.prime?
就这么简单。如果你想用自己的方法

require 'prime'

def prime?(num)
    num.prime?
end

Ruby附带了预定义的类,如
Prime
。你所要做的就是把这个类要求到你的项目中去

require 'prime'
然后,您可以使用一些
素数方法
,例如first来获取前x个素数元素:

Prime.first(5) # Ret => [2, 3, 5, 6, 11]
或者你可以这样做:

Prime.each(100) do |prime|
  p prime # Ret => [2, 3, 5, 7, 11, ..., 97]
end

我希望这对你有帮助。。通过miksii

Ruby附带了预定义的类,如
Prime
。你所要做的就是把这个类要求到你的项目中去

require 'prime'
然后,您可以使用一些
素数方法
,例如first来获取前x个素数元素:

Prime.first(5) # Ret => [2, 3, 5, 6, 11]
或者你可以这样做:

Prime.each(100) do |prime|
  p prime # Ret => [2, 3, 5, 7, 11, ..., 97]
end

我希望这对你有帮助。。通过Miksii

您可以不使用Math.sqrt通过以下方式完成:

def is_prime?(number)
  (2..number-1).each {|n| return false if number <= 1 || number % n == 0}
  return true
end
def是素数?(数字)

(2..number-1)。如果number则每个{n |返回false,您可以不使用Math.sqrt按以下方式执行:

def is_prime?(number)
  (2..number-1).each {|n| return false if number <= 1 || number % n == 0}
  return true
end
def是素数?(数字)

(2..number-1).每个{n |返回false if number.“我建议你算出算法应该是什么。如果必要的话,用英语写出来。然后确保你正确地将它转换为Ruby”--例如,读@J-Dizzle:我认为对于一个与sy斗争的人来说,这个级别有点太高了