判断是否是素数的问题?总说:wrong answer 我找不出哪里错了.

zhu163 2006-06-05 04:12:21
有多组数据,每组数据由两个正整数M,N组成。(0<M<N<1000000)
输出一个整数,表示介于M,N之间(包括M,N)的素数的数量。
Sample Input
5 10
1 3
6 8

Sample Output
2
2
1
我的如下:
#include <stdio.h>
#include <math.h>
int main()
{
int i, j, M, N;
int count, c = 0;
do
scanf("%d %d", &M, &N);
while( M < 1 || M >=1000000 || N < 1 || N >= 1000000 || M >= N);
for(i = M; i <= N; i++)
{
count = 0;
for(j = 1; j <= sqrt(i); j++)
{
if (1 == i) break;
if (i % j == 0) count++;
}
if (1 == count) c++;

}
printf("%d", c);
return 0;
}

...全文
316 20 打赏 收藏 转发到动态 举报
写回复
用AI写文章
20 条回复
切换为时间正序
请发表友善的回复…
发表回复
zhu163 2006-06-07
  • 打赏
  • 举报
回复
我是一个普通学校上学的,我是在网上的看到的.
xxmpp 2006-06-06
  • 打赏
  • 举报
回复
加1太慢,加2比较好
最好记住找到的质数存起来,然后直接选
zhu163 2006-06-06
  • 打赏
  • 举报
回复
在这里 http://acm.tongji.edu.cn/showproblem.php?problem_id=1010
SamuelKevin 2006-06-06
  • 打赏
  • 举报
回复
这个程序已经可以在你们学校的ACM网站AC了 你可以提交了 呵呵
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define LEN 500000
#define MAX 1000000
char flag[LEN];

int main()
{
int i,j,k;
int M,N;
int start;
int end;
int length;
memset (flag,'t',LEN*sizeof(char));
flag[0]='f';
for (i=1; i<1000; i++)
{
if ( flag[i]=='t')
{
k=i*2+1;
for (j=k*3; j<MAX; j+=(k*2))
{
flag[(j-1)/2] = 'f';
}
}
}
while ( scanf("%d%d",&M,&N)!=EOF )
{
length=0;
start=M+(M%2==0?1:0);
end=N-(N%2==0?1:0);
for (i=start; i<=end; i+=2)
{
if ( flag[(i-1)/2]=='t')
{
length++;
}
}
length += (M<=2?1:0);
printf("%d\n", length);
}

return 0;
}

第1次提交的时候开了个100万的数组 超了4K 这次没事了
Memory Time Language
1010 Accepted 516 k 24 ms C

SamuelKevin 2006-06-06
  • 打赏
  • 举报
回复
楼上的 请问1-1000000有0个素数吗?
下次调试好一点再提交啊
MagicCarmack 2006-06-06
  • 打赏
  • 举报
回复
#include <stdio.h>
#include <math.h>
int main()
{
int i, j, M, N;
int c = 0;
do
scanf("%d %d", &M, &N);
while( M < 1 || M >=1000000 || N < 1 || N >= 1000000 || M >= N);

for(i = M; i <= N; i++)
{
for(j = 1; j <= sqrt(i); j++)
{
if (1 == i) break;
if (i % j == 0) break;
}
if (sqrt(i) == j) c++;

}
printf("%d", c);
return 0;
}
SamuelKevin 2006-06-05
  • 打赏
  • 举报
回复
把你题目的地址发来 我去submit一下
zhu163 2006-06-05
  • 打赏
  • 举报
回复
我想知道我的那个有地方是不妥的.
zhu163 2006-06-05
  • 打赏
  • 举报
回复
我编译也没问题,输出的结果也对,我就是不知道它总说我:wrong answer.我不知道有那没想到的地方?
是一个在线评判的平台上做的.
SamuelKevin 2006-06-05
  • 打赏
  • 举报
回复
/////////////汗颜 这里忘记优化下
for (i=2; i<=sqrt(MAX); i++)
aniude 2006-06-05
  • 打赏
  • 举报
回复
这个不就是例题改了下吗?你书上的题消化了没有!!
SamuelKevin 2006-06-05
  • 打赏
  • 举报
回复
开个大数组一次性用筛法算出来省时间(不过多内存)
memset()函数在string.h中

老是WA 你那题不会是什么ACM题吧?
SamuelKevin 2006-06-05
  • 打赏
  • 举报
回复

#define MAX 1000000
修改一下

现在的int好多编译器都是2^31-1了
SamuelKevin 2006-06-05
  • 打赏
  • 举报
回复
#include <stdio.h>
#define MAX 20
int num[MAX+1];

int main()
{
int i,j;
int M,N;
int len;
memset(num,0,(MAX+1)*sizeof(int));
num[1]=1;
for (i=2; i<=MAX; i++)
{
if (num[i]==0)
{
for (j=2*i; j<=MAX; j+=i)
{
num[j]=1;
}
}
}
while ( scanf("%d%d",&M,&N)!=EOF )
{
len=0;
for (i=M; i<=N; i++)
{
if ( num[i]==0 )
{
len++;
}
}
printf("%d\n", len);
}
return 0;
}

//////////////////////////////////
nobush() ( ) 信誉:100 的话实在让人汗颜啊
现在的int还是32767吗?
32767的时代。。。。
zhu163 2006-06-05
  • 打赏
  • 举报
回复
当改为 for(j = 2; j <= sqrt(i); j++) 之后当 M 等于2时就少算一个了.
ywhbn 2006-06-05
  • 打赏
  • 举报
回复
for(i = M; i <= N; i++)
{
count = 0;
for(j = 1; j <= sqrt(i); j++) // 改为 for(j = 2; j <= sqrt(i); j++)
{
if (1 == i) break;
if (i % j == 0) count++;
}
if (1 == count)
c++;

}
zhu163 2006-06-05
  • 打赏
  • 举报
回复
我用 long i, j, M, N;
应该行吧?
nobush 2006-06-05
  • 打赏
  • 举报
回复
我看错了,
1000000
M,N 用int只能到32767;
有多组数据
你只有一组数据计算
zhu163 2006-06-05
  • 打赏
  • 举报
回复
说了 (0 < m < n)
我加上:
int tmp;
while( M < 1 || M >=1000000 || N < 1 || N >= 1000000 || M == N)
if ( M > N )
{
tmp = M;
M = N;
N = tmp;
}
它也说:wrang  answer.我就把上面的去掉了.
nobush 2006-06-05
  • 打赏
  • 举报
回复
题目没说M < N吧?

33,311

社区成员

发帖
与我相关
我的任务
社区描述
C/C++ 新手乐园
社区管理员
  • 新手乐园社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧