C语言求素数的两种方法

1,判断n是否能被2~n-1整除

输入的数n不能被2-(n-1)整除,说明是素数

输入的数n能被2-(n-1)整除,说明不是素数

注意:1不是素数,素数是指大于1的自然数,除了1和该数自身外,无法被其他自然数整除的数。

法一:

#include<stdio.h>
int main()
{
    int i, n;
    printf("please input a number:"); 
    scanf("%d", &n);
    for (i = 2; i < n ; i++)
    {
        if (n%i == 0)
            break;
    }
    if (n <=1 ) printf("This is not a prime\n");
    else  if (i < n) printf("This is not a prime.\n"); 
    else printf("This is a prime.\n");
    return 0;

}

法二:

#include<stdio.h>
int main()
{
    int i, n;
    printf("please input a number:"); 
    scanf("%d", &n);
    if(n<=1)
        printf("This is not  a prime\n");
    else
        {
        for (i = 2; i < n ; i++)
	    {
             if (n%i == 0)
             break;
	     }
         if(i>=n)
	        printf("This is a prime\n");
         else
	        printf("This is not a prime\n");
	  }
	 return 0;
}

 

 

 

 

2,判断n是否能被2~√n间的整数整除

输入的数n不能被2-√n整除,说明是素数

输入的数n能被2-√n整除,说明不是素数

 

#include<stdio.h>
#include<math.h>
int main()
{
    int n,i;
    double k;
    printf("please input a number:"); 
    scanf("%d", &n);
    k = sqrt(n);
    for (i = 2; i <= k;i++)
    {
        if (n%i == 0) break;
    }
    if (n <=1 ) printf("This is not a prime\n");
    else if (i <= k) printf("This is not a prime.\n");
    else printf("This is a prime\n");
    return 0;
 
}

法二:

#include<stdio.h>
#include<math.h>
int main()
{
    int n,i,k;
    printf("please input a number:"); 
    scanf("%d", &n);
    if(n<=1)
        printf("This is not  a prime\n");
    else
    {
        k=sqrt(n);
        for (i=2;i<=k;i++)
        {
            if (n%i==0)
            break;
        }
        if(i>=k+1) 
            printf("This is a prime.\n");	
        else 
            printf("This is not a prime.\n");
    }
    return 0; 
}

以上两个程序的法二:Modified on April 22, 2019

对于评论出现的问题,在此整理一下

运行软件: VC++ 6.0

 

weixin_43912791: 这段代码识别不了1啊。。

回答:素数,指在大于1的自然数中,除了1和该数自身外,无法被其他自然数整除的数。所以没考虑1的情况。

 

weixin_43412408: 能问下i>k的逻辑是什么?想不太明白

第二个方法:对一个数n,如果他能分解成n=pq,那么pq里必然有一个大于等于根号n一个小于等于根号n,也就是说一个合数n必然有一个因子是小于等于根号n的. 所以对一个数n,只要检验他有没有小于等于根号n的因子就可以了(检验小于等于n的因子使循环次数变少,这也是简化的原因)

 

写这篇文章的初衷是给自己提供一个思路,没有考虑太多的情况,没想到这么多人看,所以重新整理了一下代码。

感谢@ 锦言肾行的分享

 

 

素数的定义是只能被1和他本身整除,1不是素数.因此要判断一个数是否为素数.就要判断它能不能被比他小的所有素数整除,这是一个算法.(写到算法时,我只能写出用它除以比他小的所有数,造成运算速度低下)
这里给出的是一个更快速的方法.要判断一个数是否为素数,只要判断比它开根号后的数小的数,能否把它整除.
为什么可以这样做呢.从百度得到的答案如下:
如果一个质数大于根号n,而n可以除尽它,那么n必然也可以除尽一个更小的质数。
例如21,它可以除尽7,而它同样可以除尽3。所以判断21是否质数,只需要判断21是否可以除尽2和3就可以了。5和7和11就不需要判断了。
想来就是这样,例如21.根号21乘根号21等于21.则当一个比根号21的数大的数乘另一个数得到21.另一个数必然小于根号21.
由此可以得到一个法2较快的素数判断算法 

 

 

 

 

 

 

评论 26
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

const

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值