获取 Ada 中的素数列表
obtaining a list of prime numbers in Ada
我制作了一个程序,用于获取 ADA 中的素数列表并使用以下在线编译器:
https://rextester.com/l/ada_online_compiler
我的代码如下:
--GNAT 8.3.0
with Ada.Text_IO, Ada.Integer_Text_IO;
use Ada.Text_IO;
procedure prime is
function isPrime(n:in Integer) return Boolean is
begin
for i in 2..n loop
if n mod i=0 then
return False;
end if;
end loop;
return True;
end isPrime;
begin
for i in 1..100 loop
if isPrime(i)=True then
Ada.Text_IO.Put_Line(Integer'Image(i));
end if;
Ada.Text_IO.Put_Line(Integer'Image(i));
end loop;
end prime;
而不是打印素数列表,它只打印 1。我在 C 中编写了相同的代码,完全没有问题。
您在 isPrime() 中的 for 循环将每个大于 1 的值检查为“n mod n = 0”,这将导致您对每个大于 1 的值 return false。更改for循环条件为
for i in 2..(n-1) loop
然后从那里开始工作
扩展 Jere 的 , several simple primality tests 将简化 isPrime
循环中的可分性测试:
唯一的偶素数2,可以立即处理:
if N = 2 then
return True;
end if;
所有剩余的偶数都可以消除:
if N mod 2 = 0 then
return False;
end if;
剩下 3 .. √N 范围内的奇数要检查:
for i in 3 .. Positive (Sqrt (Float (N))) loop
if N mod i = 0 then
…
end if;
end loop;
定义一个包含素数的 Prime_Number
类型会更好。
subtype Prime_Number is Positive range 2 .. Positive'Last with
Dynamic_Predicate => (for all I in 2 .. (Prime_Number / 2)
=> (Prime_Number mod I) /= 0);
然后,使用下面的代码段打印出 2 .. 100 范围内的所有质数。
for Index in Positive range 2 .. 100 loop
if Index in Prime_Number then
Put_Line ("Prime number: " & Index'Image);
end if;
end loop;
我制作了一个程序,用于获取 ADA 中的素数列表并使用以下在线编译器:
https://rextester.com/l/ada_online_compiler
我的代码如下:
--GNAT 8.3.0
with Ada.Text_IO, Ada.Integer_Text_IO;
use Ada.Text_IO;
procedure prime is
function isPrime(n:in Integer) return Boolean is
begin
for i in 2..n loop
if n mod i=0 then
return False;
end if;
end loop;
return True;
end isPrime;
begin
for i in 1..100 loop
if isPrime(i)=True then
Ada.Text_IO.Put_Line(Integer'Image(i));
end if;
Ada.Text_IO.Put_Line(Integer'Image(i));
end loop;
end prime;
而不是打印素数列表,它只打印 1。我在 C 中编写了相同的代码,完全没有问题。
您在 isPrime() 中的 for 循环将每个大于 1 的值检查为“n mod n = 0”,这将导致您对每个大于 1 的值 return false。更改for循环条件为
for i in 2..(n-1) loop
然后从那里开始工作
扩展 Jere 的 isPrime
循环中的可分性测试:
唯一的偶素数2,可以立即处理:
if N = 2 then return True; end if;
所有剩余的偶数都可以消除:
if N mod 2 = 0 then return False; end if;
剩下 3 .. √N 范围内的奇数要检查:
for i in 3 .. Positive (Sqrt (Float (N))) loop if N mod i = 0 then … end if; end loop;
定义一个包含素数的 Prime_Number
类型会更好。
subtype Prime_Number is Positive range 2 .. Positive'Last with
Dynamic_Predicate => (for all I in 2 .. (Prime_Number / 2)
=> (Prime_Number mod I) /= 0);
然后,使用下面的代码段打印出 2 .. 100 范围内的所有质数。
for Index in Positive range 2 .. 100 loop
if Index in Prime_Number then
Put_Line ("Prime number: " & Index'Image);
end if;
end loop;