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

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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,输出的值没问题,但行与行之间不止一个回车,有的很多有的几个,这个怎么改,只要一个就够了。

对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;
参考技术A

你好!!

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

#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;
        
    

参考技术B (先建立一个含有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;
参考技术C 关于回车问题,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"); //回车问题在此行

本回答被提问者采纳
参考技术D 行与行之间不止一个回车,有的很多有的几个,这是因为你最后一句:

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

素数和

1
素数和(5分)

题目内容:

我们认为2是第一个素数,3是第二个素数,5是第三个素数,依次类推。

现在,给定两个整数n和m,0<n<=m<=200,你的程序要计算第n个素数到第m个素数之间所有的素数的和,包括第n个素数和第m个素数。

 

输入格式:

两个整数,第一个表示n,第二个表示m。

 

输出格式:

一个整数,表示第n个素数到第m个素数之间所有的素数的和,包括第n个素数和第m个素数。

 

输入样例:

2 4

 

输出样例:

15

#include<stdio.h>
int main()
{
    int n,m;
    scanf("%d %d",&n,&m);

    int x=2;
    int cnt=0;
    int i;
    int sum=0;

    do{
        int isprime=1;
        for(i=2;i<x;i++){
            if(x%i==0){
                isprime=0;        
                break;
            }
        }
        if(isprime==1){
            cnt++;
            if(cnt>=n&&cnt<=m)
            {   
                sum+=x;             
            }
        }
        x++;
    }while(0<cnt&&cnt<=200);
    printf("%d\n",sum);
    return 0;
}

 

以上是关于C语言 输出n到m之间的所有素数的主要内容,如果未能解决你的问题,请参考以下文章

C语言m~n之间的素数

输出[m,n]之间的素数,用c语言编程怎么写。谢谢,

c语言 输出[m,n]之间素数 的程序

如何用C语言求1至100所有素数的和?

c语言 从键盘输入正整数m和n,将m到n之间的所有素数存入数组s中,并将s中元素5个一行输出。

c语言从n个数中选m个数的组合