一道关于质数和因式分解的题

要求输出从1到3000的所有n,使得n=p1*p1*p2,p1不等于p2,p1,p2均为质数。
原题地址:http://acm.jlu.edu.cn/joj/showproblem.php?pid=2770

下面是我的代码,总是RUNTIME ERROR #8……求大牛们指教。
#include <stdio.h>
#include <stdlib.h>
#include<math.h>
int check(int m);

int main()
{
int i;
int t;
int clannad;
int counter;
int flag;
int prime[300];
int count=1;

prime[0]=2;
for(t=3;t<750;t++)
{
if(check(t))
{
prime[count]=t;
count++;
}
}
for(i=12;i<=3000;i++)
{
int shuzu[3]={0,0,0};
flag=1;
counter=0;
clannad=i;

for(t=0;t<=count+1;t++)
{
if(clannad%prime[t]==0)
{
clannad/=prime[t];
shuzu[counter]=prime[t];
counter++;
t--;
if(counter==3&&clannad!=1)
{
flag=0;
break;
}
else if(counter==3&&clannad==1)
{
flag==1;
break;
}
continue;
}
}
if((shuzu[0]!=0&&shuzu[1]!=0&&shuzu[2]!=0))
{
if(flag)
{
if((shuzu[0]==shuzu[1]&&shuzu[0]!=shuzu[2])||(shuzu[0]==shuzu[2]&&shuzu[0]!=shuzu[1])||(shuzu[2]==shuzu[1]&&shuzu[0]!=shuzu[2]))
{
printf("%d\n",i);
}
}
}
}
return 0;
}
int check(int m)
{
int flag=1;
int l;
for(l=2;l<sqrt(m)+1;l++)
{
if(m%l==0)
{
flag=0;
}
if(flag==0)
break;
}
if(flag==1)
return 1;
else
return 0;
}

你的代码没有什么大问题。输出是:12 18 20 28 ……
12=2x2x3
18=3x3x2
20=2x2x5
……
你看看是不是有设置上的问题。
另:
flag==1;
break;
中的flag==1;应该为flag=1;
是不是你的平台认为这是错误而中止呢?一般情况下,像这种错误只提警告而不中止。追问

已经把flag==1改为了flag=1;上传之后仍然是Runtime error
另,这个程序自己运行没有发现问题,但是上传之后就抛出了runtime error。
谢谢你的回答

追答

就不好了。是不是你的平台较新,而提交上去后运行的平台较旧,不允许在函数的任意地方定义变量;你把int shuzu[3]={0,0,0};提前到int count=1;后看看。其他也说不清楚了……

追问

还是不行,我想放弃了。
话说acm的条条框框那么多,现在想如果能够编出正确的程序不就可以了?!谢谢你的回答啊。

温馨提示:答案为网友推荐,仅供参考
第1个回答  2013-03-09
#include <stdio.h>
#include <stdlib.h>
#include <math.h>

int IsPrime(int m) {
int i,flag = 1;
if(m < 2) return 0;
if(m == 2 || m == 3) return 1;
for(i = 2;flag && i < sqrt(m);i++) {
if(m % i == 0) flag = 0;
}
return flag;
}

void Dissociation_Prime(int n) {
int i,flag = 1;
printf("%d = ",n);
for(i = 2; i < n; ++i) {
if(IsPrime(i) && (n % i == 0)) {
if(flag) {
printf("%d",i);
flag = 0;
}
else printf("×%d",i);
n /= i;
--i;
}
}
if(flag == 0) printf("×%d\n",n);
else if(n) printf("%d\n",n);
}

int main() {
int i;
for(i = 12;i <= 30;i++)
Dissociation_Prime(i);
return 0;
}
第2个回答  2013-03-09
我看了一下程序算法是对的,是不是因为调用函数导致内存不足的问题,你试试不要调用check函数,直接判断质数,其他地方就不知道那里错了~
相似回答