Ada 2012。
我有这个定义:
with Ada.Numerics.Elementary_Functions; use Ada.Numerics.Elementary_Functions;
package body Primes is
function is_prime(n : Integer) return Boolean
is
i : Integer := 5;
begin
if n <= 3 then
return n > 1;
elsif n mod 2 = 0 or else n mod 3 = 0 then
return false;
else
--for i in 5 .. Sqrt()n + 1
loop
if n mod i = 0 or else n mod (i + 2) = 0 then
return false;
end if;
exit when i >= Sqrt(n) + 1;
i := i + 6;
end loop;
return true;
end if;
end is_prime;
end Primes;
检查n
是否为素数。这是行:
exit when i >= Sqrt(n) + 1;
提供错误
expected type "Standard.Float"
found type "Standard.Integer"
我一直在尝试Float'Value()
语句的所有部分,但后来我得到了一些关于我认为exit when
类型(字符串)的错误。现在我陷入了困境,无法进行编译。其他一切都很好,不需要审查。
我使用loop -> exit when -> end loop
的原因是因为 Ada 不支持具有指定步骤的For循环,例如Java:
for (int i = 5; i < Math.sqrt(n) + 1; i +=6)
答案 0 :(得分:3)
西蒙的答案效率更高,但为了证明你将如何按照你尝试的方式做到这一点:
exit when Float(i) >= Sqrt(Float(n)) + 1.0;
Ada根本不会像某些语言那样自动将整数转换为浮点数。 (这也意味着它不会将整数文字1
转换为Float
,因为Float
上的预定义+
运算符需要Float
您可以使用类型转换Float(1)
,而不是1.0
。)
此外,如果您以这种方式执行操作,请在循环外部计算Sqrt(Float(n))
并将其保存在变量(或等效的变量)中。在循环内的相同值上反复调用Sqrt
是没有意义的。 (是的,我知道,有人会抱怨过早优化......)
更多信息:此示例显示了如何实现类型转换。 Float'Value
并没有做那样的事情。如果你查找&#34;值属性&#34;在RM Index中,您将看到'Value
属性是一个带有String
参数的函数,并返回一个图像为字符串的数字 - 即。它解析字符串并返回一个数字,在本例中为Float
。
答案 1 :(得分:2)
Ada.Numerics.Generic_Elementary_Functions
中的平方根函数(其中Ada.Numerics.Elementary_Functions
是一个实例化)是
function Sqrt (X : Float_Type'Base) return Float_Type’Base;
只处理浮点类型。
您可以使用
exit when i * i >= n;
(请注意,如果i * i
等于n
,则n
将不会成为素数;我认为需要注意此终止条件