获取 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;