Loops Ada类型转换,循环时退出
Ada 2012 我有这样的定义:Loops Ada类型转换,循环时退出,loops,type-conversion,ada,Loops,Type Conversion,Ada,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
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;
提供错误
expected type "Standard.Float"
found type "Standard.Integer"
我一直在尝试对语句的所有部分执行Float'Value()
,但是在键入(字符串)时,我发现了一些错误,我认为exit是什么。现在我被困在这件事上,无法编译它。其他一切都很好,不需要审查
我之所以使用loop->exit when->end loop
,是因为Ada不支持指定步骤的循环,例如Java:
for (int i = 5; i < Math.sqrt(n) + 1; i +=6)
for(int i=5;i在Ada.Numerics.Generic_Elementary_函数中的平方根函数
(其中Ada.Numerics.Elementary_函数
是一个实例)是
它只处理浮点类型
你可以使用
exit when i * i >= n;
(请注意,如果i*i
等于n
,那么n
就不是素数;我认为需要注意这个终止条件)在Ada.Numerics.Generic_初等函数
中的平方根函数是
它只处理浮点类型
你可以使用
exit when i * i >= n;
(请注意,如果i*i
等于n
,那么n
就不是首要条件;我认为需要注意这个终止条件)Simon的答案效率要高很多,但为了证明你将如何按照你尝试的方式来做:
exit when Float(i) >= Sqrt(Float(n)) + 1.0;
Ada不能像某些语言那样自动将整数转换为浮点。(这也意味着它不会将整数文本1
转换为Float
,因为Float
上预定义的+
运算符需要Float
。您可以使用类型转换Float(1)
,而不是1.0
)
同样,如果您这样做,请在循环外部计算Sqrt(Float(n))
,并将其保存在变量(或等效的东西)中。在循环中对同一个值反复调用Sqrt
是没有意义的。(是的,我知道,有人会抱怨过早优化…)
更多:此示例演示如何实现类型转换Float'Value
不会做这样的事情。如果您在中查找“Value attribute”,您将看到,'Value
属性是一个函数,它接受一个字符串
参数,并返回一个以字符串为图像的数字——也就是说,它解析字符串并返回一个数字,在这种情况下,浮点Simon的答案效率更高,但是,为了演示您将如何以您尝试的方式执行此操作:
exit when Float(i) >= Sqrt(Float(n)) + 1.0;
Ada不能像某些语言那样自动将整数转换为浮点。(这也意味着它不会将整数文本1
转换为Float
,因为Float
上预定义的+
运算符需要Float
。您可以使用类型转换Float(1)
,而不是1.0
)
同样,如果您这样做,请在循环外部计算Sqrt(Float(n))
,并将其保存在变量(或等效的东西)中。在循环中对同一个值反复调用Sqrt
是没有意义的。(是的,我知道,有人会抱怨过早优化…)
更多:此示例演示如何实现类型转换Float'Value
不会做这样的事情。如果在中查找“Value attribute”,您将看到'Value
属性是一个函数,它接受字符串
参数,并返回一个图像为字符串的数字,即它解析字符串并返回一个数字,在本例中是一个浮点值
,因此基本上您要说的是,没有其他选项可以使用Sqrt
?这真的很奇怪。谢谢你们两位宝贵的回复。所以基本上你们的意思是,使用Sqrt
,没有其他选项可以做到这一点?这真的很奇怪。谢谢你们两位宝贵的回答。这个算法发现5和7都是非素数。这个算法发现5和7都是非素数。至于在循环之前将计算值赋给变量-别担心,我本来打算这么做的(事实上我以前试过,但这是我尝试过的许多可能的事情之一)。这对我真的很有帮助。谢谢至于在循环之前将计算值赋给变量——别担心,我本来打算这么做的(事实上我以前试过,但这是我尝试过的许多可能的事情之一)。这对我真的很有帮助。谢谢