C语言实现的各种素数晒

素数:

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

维基百科的定义为:prime number (or a prime) is a natural number greater than 1 that has no positive divisors other than 1 and itself. A natural number greater than 1 that is not a prime number is called a composite number.

根据这一定义我们可以实现最基础的素数晒法:

从大于一(i=2)开始,到number-1的位置截止,如果存在和这其中的数字mod,存在等于0时候,说明这个数为非素数。

但是,我们要注意输入的数字(number)不一定是大于一的数字,所以要判断是否大于一,若不成立在也为非素数。

代码实现:

#include <iostream>
using namespace std;
bool Is_Prime(int number){
    if (number<2) {//如果数字小于二时,为非素数
        return false;
    }
    for (int i=2; i<number; i++) {
        if (number%i==0) {//从2~(n-1)过程中如果取mod等于0不满足要求
            return false;
        }
    }
    return true;//排除所有可能之后,就可以得到为素数的可能
}
int main(int argc, const char * argv[]) {
    int number;
    while (scanf("%d",&number)) {
        if (Is_Prime(number)) {
            printf("YES!\n");
        }
        else{
            printf("NO\n");
        }
    }
    return 0;
}

由此我们可以发现,如果这个数为偶数且大于二的时候,那么这个数肯定不为素数,所以函数可以的到基础优化,即:

bool Is_Prime(int number){
    if (number<2) {//如果数字小于二时,为非素数
        return false;
    }
    else if (number>2&&number%2==0){
        return false;
    }
    for (int i=2; i<number; i++) {
        if (number%i==0) {//从2~(n-1)过程中如果取mod等于0不满足要求
            return false;
        }
    }
    return true;//排除所有可能之后,就可以得到为素数的可能
}

由此我们可以发现,如果一个数如果与自己小的所有 素数取mod,也都不为零时候,(本处应该运用递归的思路,由2的时候,所有的除去2以外的偶数(即2的倍数),当为其他的素数同理)。所以我们可以实现代码:

#include <iostream>
using namespace std;
int prime[10000]={2,3,5,7},n=4;//初始化数组
void Find_Prime(void){
    int flag=0;
    for (int number=8; number<10000; number++) {//从比素数数组中最大的数开始晒
        flag=1;
        for (int i=0; i<n; i++) {
            if (number%prime[i]==0) {//如果与数组中的数据为这个数的倍数,那么就不是素数
                flag=0;
            }
        }
        if (flag) {
            prime[n]=number;//如果是素数那么就存储
            n++;
        }
    }
}
int main(int argc, const char * argv[]) {
    Find_Prime();
    for (int i=0; i<n; i++) {
        printf("%d     ",prime[i]);
    }
    return 0;
}
此外,还有,如果一个数据他的根号数k =(int)sqrt(number),如果k^2都小于number了那么(k+1)*k也肯定不能为这个数,所以我们只需要判断到这个数的根号就可以。

由此我们可以得到令一个素数晒法:

代码:

#include <iostream>
#include <math.h>
using namespace std;
bool Is_Prime(int num){
    int k = (int)sqrt(num);//求出根号number
    for (int i = 2; i<=k; i++) {//从2~K开始晒
        if (num%i==0) {//
            return false;
        }
    }
    return true;
}
int main(int argc, const char * argv[]) {
    int num;
    while (scanf("%d",&num)) {
        if (Is_Prime(num)) {
            printf("YES\n");
        }
        else{
            printf("NO\n");
        }
    }
    return 0;
}
这就是我目前已知的素数晒法。

  • 2
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值