用C语言如何判断素数

如题所述

第1个回答  2018-07-20
//素数定义:除了1和本身外无法被其他自然数整除的数,叫做素数,也称质数,如:2,3,5,7一系列(负数或1和0都不是素数)
#include<stdio.h>
int main()
{
printf("请输入需要判断的数字:\n");
int num;
scanf("%d",&num); //从键盘输入数字储存到num中

if (num <= 1)
printf("%d不是素数\n",num); //只要输入小于等于1的数直接判断为不是素数
else
{
int count=0;
for (int i = 2; i < num; i++)
{
if (num%i == 0) //用num除以2,3,4,5,6。。。。等等所有数,判断是否能整除。
count++; //每次被整除时count自动增加1
}
if (count > 0) //若count大于0,则证明存在被整除的数,证明不是素数。
printf("%d不是素数\n", num);
else
{
printf("%d是素数\n", num);
}
}
return 0;
}
第2个回答  2018-07-21

用C语言判断素数有多种方法

其中最好理解的一种如下:

设定因子为n,所判断的数为x,然后n从2开始到x-1。

每次都用x%n,如果有任一判断为0,则不为素数。

下面是C语言函数代码

int sushu(int x)
{
    int i;
    for(i=2;i<x;i++)
    {
        if(x%i == 0)
        {
            return 0;
        }
    }
    return 1;
}

另外如果是大量数据需要判断是否为素数,可以用排除法来完成

例如如果要找出10000之前的所有素数,可以依次排除从2开始到100(根号10000)的数,然后剩下的都是素数。

下面是C语言代码

int main()
{
    int a[10001];
    int i ,j;
    for(i=0;i<10001;i++)
    {
        a[i] = 1;
    }
    a[0] = 0;
    a[1] = 0;
    
    for(i = 2;i<100;i++)
    {
        for(j = 2;j<100;j++)
        {
            a[i*j]=0;
        }
    }
    
    for(i=0;i<10001;i++)
    {
        if(a[i])
        {
            printf("%d",i);
        }
    }
    return 0;
}

第3个回答  2018-06-27

谓素数是指除了1和它本身以外,不能被任何整数整除的数,例如17就是素数,因为它不能被2~16的任一整数整除。因此判断一个整数m是否是素数,只需把m被2~m-1之间的每一个整数去除,如果都不能被整除,那么m就是一个素数
另外判断方法还可以简化。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之间有无因子即可)

#include<stdio.h>
#include<math.h>
void main()
{
int m,i,k;
printf("请输入一个整数:");
scanf("%d",&m);
k=(int)sqrt(m);
for(i=2;i<=k;i++)
if(m%i==0)
break;
if(i>k)
printf("%d 是素数。\n",m);
else
printf("%d 不是素数。\n",m);
}

第4个回答  2018-07-09

素数是只能被 1 和它自身整除的数 设数m

设置一个循环,从2开始,到m-1

每循环一次,就用m去除,如果没有一次相除余数等于0(不能整除)

那么他是素数

我举个例子吧 

#include<stdio.h>
int main ()
{
    int m,i,x,flag=1;
    printf("Input:");
    scanf("%d",&m);
    for(i=2;i<m;i++)
    {
    x=m%i;
    if(x==0)       /*如果循环完毕,没有 x没有等于0一次则说明没有被整除过*/
      {
      flag=0;     
      }
    }
    
    if(flag)
    {
    printf("这个数是素数:");
    }
    else
    {
     printf("这个数不是素数:");
    }
}

纯手打,楼主满意的话请采纳哦~

第5个回答  2018-08-31

题主(我这里本来想骂脏话的)是不是死了给个采纳行不行我给你写这么久

还有一种叫米勒罗宾素数法,自己去网上搜吧

有两种做法

第一种是最简单的死做法 

纯手打代码如下:

#include <bits/stdc++.h>
#define maxn 1000
using namespace std;

int n;

int main(){
cin>>n;                            //n 表示输出2~n 之间的素数
for(int i=2;i<=n;i++){
bool flag = true;          //flag记录 i 是否有约数
for(int j=2;j<=sqrt(i);j++)        
if (i % j == 0) {            //判断
flag = false;
break;
}
if (flag) cout<<i<<" \n";            //输出
}
cout<<endl;
return 0;
}

第二种叫埃氏筛法 更加高效快速

#include <bits/stdc++.h>
#define maxn 1000
using namespace std;

//纯手打

bool a[maxn];                            //如果a[i] == true 则i为合数; 反之为素数
int n;

int main(){
cin>>n;
memset(a,0,sizeof(a));
for(int i=2;i<=sqrt(n)+1;i++){
for(int j = 2;j<=n/i;j++) a[i*j] = 1;  
}
for(int i=2;i<=n;i++) if (!a[i]) cout<<i<<" ";
cout<<endl;
return 0;
}

相似回答