前 n 个素数的埃拉托色尼筛法
Sieve of Eratosthenes for first n prime numbers
我正在尝试让我的埃拉托色尼筛法程序仅输出用户请求的前 n 个质数。 Sieve 本身工作得很好——它正确地输出前 100 个素数(如下面的数组),但最后一个循环中的计数器变量工作不正常,我不明白为什么。例如,如果用户为 n 输入“5”,则只会打印前 3 个素数。
有人可以帮我找出我的错误吗?我的意图是让“计数”成为一个非常简单的计数器,每次递增 1,直到达到 n。
int n;
cout << "Enter the number of primes you want to print:\n";
cin >> n;
int arr[100] {0};
for (int i = 2; i <= sqrt(100); i++)
{
if (arr[i] == 0)
{
for (int j = 2; i*j<100; j++)
arr[j*i] = 1;
}
}
for (int i = 3, count = 0; i <= 100 && count != n; i++, count++)
{
if (arr[i] == 0)
cout << i << '\n';
}
您应该只计算素数,而不是所有数字。
循环的 i
范围也应该更正。第一个质数是2
,元素arr[100]
不可用。
for (int i = 2, count = 0; i < 100 && count != n; i++) // don't increment count here
{
if (arr[i] == 0)
{
cout << i << '\n';
count++; // count a prime number here
}
}
我有一个使用 Ada 的解决方案,它可能会给你一些帮助。
我创建了一个名为 Is_Prime 的函数,当传递给它的参数是质数时,returns 为 TRUE,否则为 FALSE。
以下是包含 Is_Prime 声明的包规范。将包规范视为类似于 C 头文件。
package Primality is
function Is_Prime(Num : Positive) return Boolean;
end Primality;
函数的实现在包体中,大致对应一个C.c文件
-----------------------------------------------------------------------
-- Primality Body --
-----------------------------------------------------------------------
with Ada.Numerics.Generic_Elementary_Functions;
package body Primality is
function Is_Prime (Num : Positive) return Boolean is
package Flt_Funcs is new Ada.Numerics.Generic_Elementary_Functions
(Float);
use Flt_Funcs;
T : Integer := 2;
Limit : constant Integer := Integer (Sqrt (Float (Num)));
Result : Boolean := True;
begin
if Num = 2 then
Result := True;
else
while T <= Limit loop
if Num mod T = 0 then
Result := False;
exit;
end if;
T := T + (if T > 2 then 2 else 1);
end loop;
end if;
return Result;
end Is_Prime;
end Primality;
Ada 允许程序员随意命名“主”文件。以下是允许用户指定要输出的素数的“主”文件。
with primality; use primality;
with Ada.Text_IO; use Ada.Text_IO;
with Ada.Integer_Text_IO; use Ada.Integer_Text_IO;
procedure List_Primes is
count : Natural;
Num : Positive := 2;
begin
Put("Enter the number of primes you want to print: ");
Get(count);
while count > 0 loop
if Is_Prime(Num) then
Put_Line(Num'Image);
count := count - 1;
end if;
Num := Num + (if Num = 2 then 1 else 2);
end loop;
end List_Primes;
样本运行的输出是:
Enter the number of primes you want to print: 20
2
3
5
7
11
13
17
19
23
29
31
37
41
43
47
53
59
61
67
71
我正在尝试让我的埃拉托色尼筛法程序仅输出用户请求的前 n 个质数。 Sieve 本身工作得很好——它正确地输出前 100 个素数(如下面的数组),但最后一个循环中的计数器变量工作不正常,我不明白为什么。例如,如果用户为 n 输入“5”,则只会打印前 3 个素数。
有人可以帮我找出我的错误吗?我的意图是让“计数”成为一个非常简单的计数器,每次递增 1,直到达到 n。
int n;
cout << "Enter the number of primes you want to print:\n";
cin >> n;
int arr[100] {0};
for (int i = 2; i <= sqrt(100); i++)
{
if (arr[i] == 0)
{
for (int j = 2; i*j<100; j++)
arr[j*i] = 1;
}
}
for (int i = 3, count = 0; i <= 100 && count != n; i++, count++)
{
if (arr[i] == 0)
cout << i << '\n';
}
您应该只计算素数,而不是所有数字。
循环的 i
范围也应该更正。第一个质数是2
,元素arr[100]
不可用。
for (int i = 2, count = 0; i < 100 && count != n; i++) // don't increment count here
{
if (arr[i] == 0)
{
cout << i << '\n';
count++; // count a prime number here
}
}
我有一个使用 Ada 的解决方案,它可能会给你一些帮助。 我创建了一个名为 Is_Prime 的函数,当传递给它的参数是质数时,returns 为 TRUE,否则为 FALSE。
以下是包含 Is_Prime 声明的包规范。将包规范视为类似于 C 头文件。
package Primality is
function Is_Prime(Num : Positive) return Boolean;
end Primality;
函数的实现在包体中,大致对应一个C.c文件
-----------------------------------------------------------------------
-- Primality Body --
-----------------------------------------------------------------------
with Ada.Numerics.Generic_Elementary_Functions;
package body Primality is
function Is_Prime (Num : Positive) return Boolean is
package Flt_Funcs is new Ada.Numerics.Generic_Elementary_Functions
(Float);
use Flt_Funcs;
T : Integer := 2;
Limit : constant Integer := Integer (Sqrt (Float (Num)));
Result : Boolean := True;
begin
if Num = 2 then
Result := True;
else
while T <= Limit loop
if Num mod T = 0 then
Result := False;
exit;
end if;
T := T + (if T > 2 then 2 else 1);
end loop;
end if;
return Result;
end Is_Prime;
end Primality;
Ada 允许程序员随意命名“主”文件。以下是允许用户指定要输出的素数的“主”文件。
with primality; use primality;
with Ada.Text_IO; use Ada.Text_IO;
with Ada.Integer_Text_IO; use Ada.Integer_Text_IO;
procedure List_Primes is
count : Natural;
Num : Positive := 2;
begin
Put("Enter the number of primes you want to print: ");
Get(count);
while count > 0 loop
if Is_Prime(Num) then
Put_Line(Num'Image);
count := count - 1;
end if;
Num := Num + (if Num = 2 then 1 else 2);
end loop;
end List_Primes;
样本运行的输出是:
Enter the number of primes you want to print: 20
2
3
5
7
11
13
17
19
23
29
31
37
41
43
47
53
59
61
67
71