C语言 输出n到m之间的所有素数

#include <stdio.h>
#include <math.h>
void main(void)
{
int i,j,m,n,k,s,a,b=0;
scanf("%d",&n);
scanf("%d",&m);
k=sqrt(m);
for(j=n;j<m;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");
}
}

首先这个算法设计的麻烦了点,能不能简化下,其次有个小毛病,比如3到1000,输出的值没问题,但行与行之间不止一个回车,有的很多有的几个,这个怎么改,只要一个就够了。
最新回答
超能吃算不算超本事

2024-11-22 14:29:20

对n到m之间所有数进行遍历,逐一判断是否为

素数
,如果是则输出。

一、算法设计:

1、输入n和m;

2、判断n和m关系,如n>m则交换;

3、遍历n到m所有值,对于每个值判断是否为素数,如是则输出;

二、参考代码:

#include <
stdio.h
>
#include <math.h>
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;
}
°小可爱

2024-11-22 15:51:01

你好!!

给你一个简单点的,你看看吧 

#include <stdio.h>
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;
        }
    }
}
锁骨草莓印

2024-11-22 09:58:50

(先建立一个含有2~up之间所有自然数的数表,在数表中删去2的倍数(不包括2);然后找2后面第一个被保留的数p(是3),再删除p的倍数(不包括p);然后再找下一个被保留的数(是5),继续上述步骤:这样继续下去,直至P大于sqrt(up)为止。最后再删除小于low的数,这样数表中剩下的数就是所要求的所有素数(low~up之间)。
1) #include <stdio.h>
#include <stdlib.h>
#include<math.h>
#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<sqrt(up);p=p->next)
{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<low)/*把小于low的多余的数删除*/
{
free(shai);
shai=shai1;
shai1=shai1->next;
}
while(shai!=NULL)
{ printf("%d ",shai->key);
shai=shai->next;}
system("PAUSE");
return 0;
}
一白遮

2024-11-22 13:44:52

关于回车问题,1楼已解释清楚。
可是你又没有发现 当输入 3 100 是 输出是从11开始的素数。 5和7并未输出。

另外 简化程序。 应将k=sqrt(m);删除。在a=1;的前面加上 k=sqrt(j);
附上程序:
#include <stdio.h>
#include <math.h>
void main(void)
{ int i,j,m,n,k,s,a,b=0;
scanf("%d",&n);
scanf("%d",&m);
for(j=n;j<m;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");} //回车问题在此行
}
}
小小

2024-11-22 11:44:32

行与行之间不止一个回车,有的很多有的几个,这是因为你最后一句:

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