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
素数和
题目内容:
我们认为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之间的所有素数的主要内容,如果未能解决你的问题,请参考以下文章