对n到m之间所有数进行遍历,逐一判断是否为素数,如果是则输出。
一、算法设计:
1、输入n和m;
2、判断n和m关系,如n>m则交换;
3、遍历n到m所有值,对于每个值判断是否为素数,如是则输出;
二、参考代码:
#include
#include
int isPrime(int n)//判断素数函数。
{
int i;
for(i = 2; i <= (int)sqrt(n); i ++)//从2到算数平方根遍历。
if(n%i == 0) return 0;//存在约数,非素数,返回0.
return 1;//是素数,返回1.
}
int main()
{
int n,m,i;
scanf("%d%d",&n,&m);//输入。
if(n>m)//如果n值较大,则交换n和m值。
{
i=n;
n=m;
m=i;
}
for(i = n; i <= m; i ++)//遍历。
if(isPrime(i))//是素数。
printf("%d ", i);//输出素数。
return 0;
}
你好!!
给你一个简单点的,你看看吧
#include
void main()
{
int a, b, count=0;
int i;
int j;
printf("输入两个整数,输出这两个数之间素数:\n");
scanf("%d%d",&a,&b);
for(i=a; i<=b; i++)
{
for(j=2; j<=i; j++)
{
if(i==j)
{
if(count == 10)
{
printf("\n");
count=0;
}
count++;
printf("%5d",i);
}
if(i%j==0)
break;
}
}
}
(先建立一个含有2~up之间所有自然数的数表,在数表中删去2的倍数(不包括2);然后找2后面第一个被保留的数p(是3),再删除p的倍数(不包括p);然后再找下一个被保留的数(是5),继续上述步骤:这样继续下去,直至P大于sqrt(up)为止。最后再删除小于low的数,这样数表中剩下的数就是所要求的所有素数(low~up之间)。
1) #include
#include
#include
#define max 10000
keytype * init(keytype *sushu)/*初始化结点*/
{
sushu=(keytype *)malloc(sizeof(keytype));
sushu->next=NULL;
return sushu;
}
keytype *creatlist(keytype *shai,int low,int up)/*建立从2开始到up的整数的链表*/
{
keytype *p,*r;
int i,_up;
shai=init(shai);
r=shai;
for(i=low;i<=up;i++)
{
p=init(p);
p->key=i;
r->next=p;
r=r->next;
}
return shai;
}
keytype *shaixuan(keytype *shaizhi,int up)/*筛选算法*/
{
keytype *p,*r,*q;
p=shaizhi->next;
for(;p->key
{r=p;
while(r->next!=NULL)
{
if(r->next->key%p->key==0) /*如果r->next->key 能被p->key整除,则r->next->key不是素数,释放r->next*/
{
q=r->next;
r->next=q->next;
free(q);
}
else r=r->next;
}
}
return shaizhi; /*返回筛选结果*/
}
int main(int argc, char *argv[])
{int up=0,_up,low=0;
keytype *shai,*shai1;
printf("输入上限和下限\n");
scanf("%d%d",&low.&up);
shai=creatlist(shai,2,up);//建立数组从2—up
up=sqrt(up);
shai=shaixuan(shai,up);//筛选2—up中的素数
shai1=shai->next;
free(shai);
shai=shai1;
shai1=shai1->next;
while(shai->key
free(shai);
shai=shai1;
shai1=shai1->next;
}
while(shai!=NULL)
{ printf("%d ",shai->key);
shai=shai->next;}
system("PAUSE");
return 0;
}
关于回车问题,1楼已解释清楚。
可是你又没有发现 当输入 3 100 是 输出是从11开始的素数。 5和7并未输出。
另外 简化程序。 应将k=sqrt(m);删除。在a=1;的前面加上 k=sqrt(j);
附上程序:
#include
#include
void main(void)
{ int i,j,m,n,k,s,a,b=0;
scanf("%d",&n);
scanf("%d",&m);
for(j=n;j
k=sqrt(j); //程序改进 在此行
a=1;
for(i=2;i<=k;i++)
if(j%i==0)
{a=0;break;}
if(a==1)
{printf("%5d",j);b++;
if(b%10==0) printf("\n");} //回车问题在此行
}
}
行与行之间不止一个回车,有的很多有的几个,这是因为你最后一句:
if(b%10==0) printf("\n");
没有包含在if(a==1)中。这样当a==0时,也会判断if(b%10==0),造成输出很多个回车。改成:
if(a==1)
{
printf("%5d",j);b++;
if(b%10==0) printf("\n");
}
应该就可以了。(注意大括号位置)
至于判断素数的简化算法,如果你是指代码可读性,那么你这种算法已经比较直观了。如果你是指代码的运行效率及运算速度,那么,你可以参考一下这个网址,里面对素数的判断有比较详细的分析:http://www.cnblogs.com/luluping/archive/2010/03/03/1677552.html