在pascal中找到下一个素数

时间:2014-10-05 09:51:47

标签: primes pascal

我试图在用户输入的数字后找到下一个素数,我必须在pascal中进行。我甚至不知道该怎么做,有人可以帮助我吗?

program PRIME;

uses crt;

var

C, N : INTEGER;

const

A=2;



Begin PS:

Writeln ('enter your number' )  ;

Read (N);

begin

Writeln(

 readln;

End.

4 个答案:

答案 0 :(得分:1)

你应该声明bool的n元素数组(素数值为真),其中n是用户输入的数字并乘以2。然后使用Eratosthenes算法的筛子找到所有素数达到n(删除所有复合数,将其值更改为false)。之后,在输入值后找到下一个素数将很容易。真值的索引是素数。

尝试编写自己的代码,然后编辑问题,如果它不起作用。

答案 1 :(得分:0)

两个提示:

  • 如果输入的数字是< 2然后下一个素数是2。

  • 如果输入的数字是> = 2,那么下一个素数是一个奇数,大于输入的数字,小于输入数字的两倍(Bertrand的假设)。

不,我们不会为您编写Pascal代码。

答案 2 :(得分:0)

解决这个问题的第一步是弄清楚如何手工完成。来自维基百科:

  

验证给定数字的素数的简单但缓慢的方法   n被称为试验分裂。它包括测试n是否为a   2和sqrt {n}之间的任意整数的倍数。

因此,如果您获得6,那么您将首先测试数字7以查看它是否为素数。通过将所有整数从2除以7的平方根(2.645751311)来测试7是否为素数。所以你必须只测试7是否可以被2整除。如果用户输入14,你首先要测试15是否可以被从2到15的平方根(3.872983346)的任何整数整除。因此,您将测试15是否可以被2或3整除。

涉及两个循环。一个是重复加1输入数 - 也就是说 - 如果他们输入10,你测试11表示素数,然后是12,然后是13,然后是14,然后是15,等等。另一个循环是将所有整数除以2和检查当前数字的平方根是否完好。将它除以2,是否有余数?除以3,还有余数吗?除以4,还有余数吗?等等。每次你得到一个没有余数的除法时你可以停止那个循环,因为你知道你没有找到一个素数,需要递增值并重新计算平方根并重新开始分割。

在Free Pascal中,它看起来像这样:

program NextPrimeNumber;

uses
   Math;


var
   user_input : integer;
   next_prime : integer;


function CalculateNextPrimeNumber(value :  integer) : integer;

var 
   next_prime_not_found :  boolean = true;
   square_root      : integer = 0;
   i            : integer = 0;
   remainder        : integer = 0;
   result       : integer = 0;
   successful_divisions : integer = 0;


begin
   (* loop through the numbers above our value till we find one that
      is not divisible *)
   while next_prime_not_found do
   begin
      successful_divisions := 0;
      value := value + 1;
      square_root := trunc(sqrt(value));
      (* try and divide by all the numbers between 2 and the square root of
         out current number (square root value truncated 
         to next lowest integer) *)
      for i := 2 to square_root do
      begin
         DivMod(value,i,result,remainder);
         if remainder = 0 then 
         begin
            successful_divisions := successful_divisions + 1;
            (* this is a non-prime number, so quit trying more divisions *)
            break;
         end;
      end;
      if successful_divisions = 0 then
         (* we found a prime so stop looking by setting the value 
            the while loop is checking to false *)
         next_prime_not_found := false;
   end;
   CalculateNextPrimeNumber := value;
end;


begin
   writeln('enter a postive number');
   readln(user_input);
   next_prime := CalculateNextPrimeNumber(user_input);
   writeln('the next prime number after ',user_input,' is ',next_prime);
end.

答案 3 :(得分:0)

var a,y,i,k:qword;
f:text;
begin
    assign(f,'numere.prime');
    reset(f);
    while not eof(f) do 
    begin
        readln(f,i);
    end;
    close(f);
    repeat
        k:=0;
        inc(i);
        reset(f);
        while not eof(f) do 
        begin
            readln(f,a);
            if i mod a = 0 then 
            begin
                inc(k);
                break;
            end;
        end;
        close(f);
        if k=0 then 
        begin 
            append(f);
            writeln(f,i);
            close(f);
        end;
    until i=10000000;
end.

该程序将10000000以下的所有素数写入文件中。稍后,您可以编写一个新程序来检查输入的数字是否在该文件中。 (在文件的第一行是'2')