素数

觉得还是总结一下为好
这里涉及到直接判断和筛法(PS:黑书上看到一个更优的方法,但并不太会,等会了以后尽量补上)

利用定义直接判断:

#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<cmath>
using namespace std;
int n;
int i,j;
bool f=false;

bool pd(int x)
{
    if (x==2) return true;
    for (j=2;j<=trunc(sqrt(x));j++)
        if (x%j==0)
            return false;
    return true;
}

int main()
{
    scanf("%d",&n);
    for (i=2;i<=n-2;i++)
        if (pd(i) && pd(i+2))
            {
                printf("%d %d\n",i,i+2);
                f=true;
            }
    if (f!=true)
        printf("empty");
  return 0;
}

素数的筛法:

#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
bool pd[10001]={false};
int prime[5000]={0};
int i,j;
int zz=0;
int n;
bool f=false;

int main()
{
    scanf("%d",&n);
    for (i=2;i<=n;i++)
        {
            if (pd[i]==false)
                prime[++zz]=i;
                for (j=i;j<=n/i;j++)
                    pd[i*j]=true;
        }
    for (i=1;i<=zz-1;i++)
        if (prime[i]+2==prime[i+1])
            {
                printf("%d %d\n",prime[i],prime[i+1]);
                f=true;
            }
    if (f!=true)
        printf("empty");
  return 0;
}

PS:上题转自NOI题库-素数对http://noi.openjudge.cn/ch0112/10/

### 定义 质数和素数在数论中常被看作是等同的概念,素数是指大于 1 且只能被 1 和自身整除的自然数[^1][^2]。 ### 性质 - **基本整除性质**:质数大于 1,并且除了 1 和它自身外,不能被其他自然数整除。例如 2、3、5、7 等,2 只能被 1 和 2 整除,3 只能被 1 和 3 整除。 - **质数的个数无限**:欧几里得在《几何原本》中已经证明了质数的个数是无限的。假设质数的个数是有限的,设这些质数为 $p_1,p_2,\cdots,p_n$,考虑数 $N = p_1\times p_2\times\cdots\times p_n+1$。如果 $N$ 是质数,那么就找到了一个不在假设中的质数;如果 $N$ 是合数,那么它必然能被某个质数整除,但这个质数不可能是 $p_1,p_2,\cdots,p_n$ 中的任何一个,这也产生了矛盾,所以质数的个数是无限的。 - **算术基本定理**:任何一个大于 1 的自然数 $N$,如果 $N$ 不为质数,那么 $N$ 可以唯一分解成有限个质数的乘积,即 $N = p_1^{a_1}p_2^{a_2}\cdots p_k^{a_k}$,其中 $p_1 < p_2<\cdots < p_k$ 是质数,$a_1,a_2,\cdots,a_k$ 是正整数。例如,$60 = 2^2\times3\times5$。 ### 相关知识 - **质数的判断方法**: - **普通循环法**:判断一个数 $n$ 是否为质数,可从 2 到 $\sqrt{n}$ 检查是否能整除 $n$,若能则不是质数,否则是质数。代码示例如下: ```cpp #include <iostream> #include <cmath> using namespace std; bool isPrime(int n) { if (n <= 1) return false; for (int i = 2; i <= sqrt(n); i++) { if (n % i == 0) return false; } return true; } int main() { int num; cout << "请输入一个数: "; cin >> num; if (isPrime(num)) { cout << num << " 是质数。" << endl; } else { cout << num << " 不是质数。" << endl; } return 0; } ``` - **质数在密码学中的应用**:在现代密码学中,质数起着至关重要的作用。例如,RSA 算法是一种广泛使用的公钥加密算法,它的安全性基于大整数分解的困难性,而大整数分解的关键就是将一个大的合数分解为质数的乘积。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值