c语言筛选法判断质数

楼上的别在那误导人,你那叫筛选法吗?
先解释一下筛选法的步骤:
<1>先将1挖掉(因为1不是素数)。
<2>用2去除它后面的各个数,把能被2整除的数挖掉,即把2的倍数挖掉。
<3>用3去除它后面的各数,把3的倍数挖掉。
<4>分别用4、5…各数作为除数去除这些数以后的各数。
上述操作需要一个很大的容器去装载所有数的集合,只要满足上述条件,即2的N次方的全部置0,3的N次方的全部置0,4的N次方的全部置0.。。。一直到这个数据集合的末尾,这样一来不为0的数就是素数了,然后按下标在里面进行查找就好了
筛选法程序如下
#include<stdio.h>
intmain()
{
intx[100001];
inttemp,n,i;
//初始化数组
for(i=0;i<100001;i++)
x[i]=0;
//初始化数组完成
/*
预计结果,
数组中质数为0,其它为1
*/
x[0]=x[1]=1;//因为0和1不能通过计算得到,所以只能手工置1,1即不是合数也不是质数
for(i=2;i<100001;i++)
{//循环数组中的每个数
if(x[i]==0){//如果该数所存的值为0,即第一次接触此数
temp=2*i;//将它的二倍,及n倍(要小于100000),都置为1,因为这些数都能被i整除
while(temp<=100000)
{
x[temp]=1;
temp+=i;
}
}
}
scanf("%d",&n);
while(n!=0)
{
if(x[n]==0)
printf("素数
");
else
printf("合数
");
scanf("%d",&n);
}
return0;
}
如果你觉得这个方法不好理解,你可以用上面他们写的那些常规算法,但是数字过大的话,算起来是很慢的

❷ c语言编程 判断一个数是否为质数

错误较多,修改如下:

//---------------------------------------------------------------------------
#include <stdio.h>
void main()
{
int a,n;
scanf("%d",&a);
if(a==0||a==1)
printf("no");
else if(a==2) //注意这里
printf("yes");
else
{//注意这里
for(n=2;n<a;n++)
{
if(a%n==0)
{ //注意这里
printf("no");
break; //注意这里
} //注意这里
}
if (n==a)//注意这里
{
printf("YES");
}
}//注意这里
}
//---------------------------------------------------------------------------

❸ C语言编程:判断某数是否是质数

#include<stdio.h>
#include
<math.h>//包含sqrt函数
int
prime(int
m);
main(){
int
m;
scanf("%d",&m);
if(prime(m))
printf("%d是质数",m);
else
printf("%d不是质数",m);
}
int
prime(int
m){
int
i,n=sqrt(m);
for(i=2;i<=n;i++)
{
if(m%i==0)return
0;//如果整除,终内止循环,容返回0
}
return
1;
}

❹ 用C语言如何判断素数

素数又称质数,所谓素数是指除了 1 和它本身以外,不能被任何整数整除的数,例如17就是素数,因为它不能被 2~16 的任一整数整除。

思路1、判断一个整数m是否是素数,只需把 m 被 2 ~ m-1 之间的每一个整数去除,如果都不能被整除,那么 m 就是一个素数。

思路2、判断方法还可以简化。

m 不必被2~m-1之间的每一个整数去除,只需被2~√m之间的每一个整数去除就可以了。如果 m 不能被2~√m间任一整数整除,m必定是素数。例如判别17是是否为素数,只需使17被2~4之间的每一个整数去除,由于都不能整除,可以判定17是素数。


原因:因为如果m能被2~m-1之间任一整数整除,其二个因子必定有一个小于或等于√m,另一个大于或等于√m。

例如16能被2、4、8整除,16=2*8,2小于 4,8大于4,16=4*4,4=√16,因此只需判定在2~4之间有无因子即可。


两种思路的代码请看解析。

拓展资料:

素数(prime number)又称质数,有无限个。素数定义为在大于1的自然数中,除了1和它本身以外不再有其他因数。

C语言是一门面向过程、抽象化的通用程序设计语言,广泛应用于底层开发。C语言能以简易的方式编译、处理低级存储器。C语言是仅产生少量的机器语言以及不需要任何运行环境支持便能运行的高效率程序设计语言。

网络——C语言

❺ 用C语言如何判断素数

按照如下步骤即可用C语言判断素数:

1、首先打开visual C++ 6.0,然后点击左上角的文件,再点击新建。

❻ C语言判断素数

#include "stdafx.h"
#include <stdio.h>
#include <iostream>
using namespace std;
int prime(int x){
for(int i=2;i<x;i++){
if(x%i==0)
return 0;
}
return 1;
}
int main(){
int a=0; // 素数的个数
int num[9]; // 输入的整数
int numl[9]={0};
printf("输入10个整数:\n");
cfu:
//有个小BUG需要输入11个数,最后一个不算入计算之内。
for(int i = 0;i < 10;i++){
scanf("%d\n",&num[i]);
}
for (int i = 0;i < 10;i++)
{
if (num[i] >= 50 && num[i] <= 2000)
{
//判断是不是素数;
if(prime(num[i])==1){
printf("%d 不是素数\n",num[i]);
}
else{
printf("%d 是素数\n",num[i]);
numl[a++] = num[i];
}
}else{
printf("请输入50到2000之间的数\n");
goto cfu;
}
}
//排序写在这里就可以了。
int lenth = a;
cout << "长度为: "<< lenth << endl;
for (int i = 0;i < lenth-1;i++)
{
for (int j = 0;j < lenth-1-i;j++)
{
if (numl[j] < numl[j+1] )
{
int temps = numl[j];
numl[j] = numl[j+1];
numl[j+1] = temps;
}
}
}
for (int i=0;i<lenth;i++)
{
printf("%d ",numl[i]);
}
while(1);
return 0;
}
//好像看错题了,我的是输入10个数判断是否是素数,,,,,
//这个重新写了一个,就符合题的意思了,你想输出其他的素数就自己加条件,当成拓展就可以了.
#include "stdafx.h"
#include <iostream>
using namespace std;
int prime(int x){
for(int i= 2;i< x ; i++){
if(x%i == 0)
return 0;
}
return 1;
}
int _tmain(int argc, _TCHAR* argv[])
{
int m,k=0;
int arr[2000]={0};
printf("输入50到2000之间的整数: ");
cfu:
scanf("%d",&m);
if (m >= 50 && m <= 2000)
{
//判断在m以内有素数
for (int i =2;i < m; i++)
{
if (prime(i)==1){
printf("%d 是素数\n",i);
arr[k++]= i;
if (k == 10)
{
break;
}
}else{
printf("%d 不是素数\n",i);

}
}

}else{
printf("输入50到2000之间的整数");
goto cfu;
}
cout << "K的值: "<< k << endl;
for (int i = 0;i < k-1;i++)
{
for (int j = 0;j < k-1-i;j++)
{
if (arr[j] < arr[j+1] )
{
int temps = arr[j];
arr[j] = arr[j+1];
arr[j+1] = temps;
}
}
}
printf("10个数排序:");
for (int i = 0;i< k; i++)
{
printf("%d ",arr[i]);
}
while(1);
return 0;
}

❼ 求C语言中 判断素数的 代码!!!!!

基本思想:把m作为被除数,将2—INT( )作为除数,如果都除不尽,m就是素数,否则就不是。

可用以下程序段实现:

void main()

{ int m,i,k;

printf("please input a number: ");

scanf("%d",&m);

k=sqrt(m);

for(i=2;i<k;i++)

if(m%i==0) break;

if(i>=k)

printf("该数是素数");

else

printf("该数不是素数");

}

将其写成一函数,若为素数返回1,不是则返回0

int prime( m%)

{int i,k;

k=sqrt(m);

for(i=2;i<k;i++)

if(m%i==0) return 0;

return 1;

}

(7)c语言质数判断扩展阅读:

筛法求素数

一、基本思想

用筛法求素数的基本思想是:

把从1开始的、某一范围内的正整数从小到大顺序排列, 1不是素数,首先把它筛掉。剩下的数中选择最小的数是素数,然后去掉它的倍数。依次类推,直到筛子为空时结束。

如有:

1 2 3 4 5 6 7 8 9 10

11 12 13 14 15 16 17 18 19 20

21 22 23 24 25 26 27 28 29 30

1不是素数,去掉。剩下的数中2最小,是素数,去掉2的倍数,余下的数是:

3 5 7 9 11 13 15 17 19 21 23 25 27 29

剩下的数中3最小,是素数,去掉3的倍数,如此下去直到所有的数都被筛完,求出的素数为:

2 3 5 7 11 13 17 19 23 29

二、C++实现

1、算法一:令A为素数,则A*N(N>1;N为自然数)都不是素数。

#definerange2000

bool

IsPrime[range+1];

/*set函数确定i是否为素数,结果储存在IsPrime[i]中,此函数在DEV

C++中测试通过*/

voidset(boolIsPrime[])

{

inti,j;

for(i=0;i<=range;++i)

IsPrime[i]=true;

IsPrime[0]=IsPrime[1]=false;

for(i=2;i<=range;++i)

{

if(

IsPrime[i])

{

for(j=2*i;j<=range;j+=i)

IsPrime[j]=false;}}}

2、

说明:解决这个问题的诀窍是如何安排删除的次序,使得每一个非质数都只被删除一次。 中学时学过一个因式分解定理,他说任何一个非质(合)数都可以分解成质数的连乘积。

例如,16=2^4,18=2 * 3^2,691488=2^5 * 3^2 * 7^4等。如果把因式分解中最小质数写在最左边,有16=2^4,18=2*9,691488=2^5 * 21609,;

换句话说,把合数N写成N=p^k * q,此时q当然是大于p的,因为p是因式分解中最小的质数。由于因式分解的唯一性,任何一个合数N,写成N=p^k * q;的方式也是唯一的。

由于q>=p的关系,因此在删除非质数时,如果已知p是质数,可以先删除p^2,p^3,p^4,... ,再删除pq,p^2*q,p^3*q,...,(q是比p大而没有被删除的数),一直到pq>N为止。

因为每个非质数都只被删除一次,可想而知,这个程序的速度一定相当快。依据Gries与Misra的文章,线性的时间,也就是与N成正比的时间就足够了(此时要找出2N的质数)。

代码如下:

#include<iostream>

#include<cmath>

usingnamespacestd;

intmain()

{

intN;cin>>N;

int*Location=newint[N+1];

for(inti=0;i!=N+1;++i)

Location[i]=i;

Location[1]=0;//筛除部分

intp,q,end;

end=sqrt((double)N)+1;

for(p=2;p!=end;++p)

{

if(Location[p])

{

for(q=p;p*q<=N;++q)

{

for(intk=p*q;k<=N;k*=p)

Location[k]=0;

}

}

}

intm=0;

for(inti=1;i!=N+1;++i)

{

if(Location[i]!=0)

{

cout<<Location[i]<<"";

++m;

}

if(m%10==0)cout<<endl;

}

cout<<endl<<m<<endl;

return0;

}

该代码在Visual Studio 2010 环境下测试通过。

以上两种算法在小数据下速度几乎相同。