回 帖 发 新 帖 刷新版面

主题:这道题怎么通不过?????

[em18] 我在“http://acm.tongji.edu.cn”做了一道题 题目是这样的:
Problem
素数是的只能被1和它本身整除的自然数。判断一个数是素数的方法是使用2到该数的平方根的素数除它,若有能整除的则该数不是素数。

Input
本题有多组数据,每组数据由两个正整数M,N组成。(0<M<N<1000000)

Output
输出一个整数,表示介于M,N之间(包括M,N)的素数的数量。

Sample Input
5 10
1 3
6 8

Sample Output
2
2
1


我的程序代码是
program put;
var
i,j,k:longint;
n,m:longint;
p,o:longint;
b:boolean;
label 1;
begin{4}
1:  while not seekeof (Input) do
  begin
   readln(m,n);
   k:=0;
   if m=n then begin writeln(1);goto 1; end;
   if n<m then exit;
    begin
    k:=0;
     b:=true;
     if m=1 then m:=m+1;
     for i:=m to n do
      begin
       for j:=2 to round(sqrt(i)) do
        if i mod j=0 then
         begin b:=false;break;end;
        if (b=true) then
        begin k:=k+1;end
        else begin b:=true;end;
      end;
     writeln(k);goto 1;
    end;
  end;
end.

(水平有限)

运行起来的答案和[url=http://acm.tongji.edu.cn/down/problem/1010.exe]样例程序[/url]的答案是一样的,但是交上去系统批改却是时间超出(系统要求时间小于2秒,我的只有一秒多!)
[em18][em18][em18][em18]

回复列表 (共6个回复)

沙发

可能数据有很多个,用筛法先算好比较好

板凳

用筛选时间差不多,是不是Free 里不能用goto?

3 楼

可以呀

4 楼

我的AC了!
不过不够优,如果能帮我改进一下,不胜感谢!
P.S. 我发现楼主的一些错误了,一是m=n不一定有一个素数,因为m可能为合数,另外值得
注意的是1不是素数

program tju1010;
const
maxn=1000000;
var
prime:array [0..maxn div 8] of byte;
a,b,i,j,total:longint;

procedure f(p:longint);
var
t:longint;
begin
t:=p div 8;
prime[t]:=prime[t] or (1 shl (p mod 8))
end;

function  check(p:longint):boolean;
var
t:longint;
begin
t:=p div 8;
exit((prime[t] and (1 shl (p mod 8)))<>0);
end;

begin
fillchar(prime,sizeof(prime),0);
prime[0]:=2;
for i:=2 to maxn do
  if not check(i) then
  for j:=2 to maxn div i do
   begin
    f(i*j);
   end;
  while not seekeof(input) do
  begin
   readln(a,b);
   total:=0;
   for i:=a to b do
    if not check(i) then
    inc(total);
   writeln(total);
  end;
end.

5 楼

谢谢,m=n的那个错误我已经改了,但还是没有AC,而1不是素数我在程序中的“if m=1 then m:=m+1;”一句中应该体现出来了吧?!

6 楼

如果是wa的话,会不会是round(i)应该改成trunc(i)

我来回复

您尚未登录,请登录后再回复。点此登录或注册