首页 > 编程语言 >算法板子:质数——判定质数、分解质因数、筛质数

算法板子:质数——判定质数、分解质因数、筛质数

时间:2024-08-10 12:25:44浏览次数:14  
标签:prime cout int 质数 板子 质因数 合数

目录

一、判定质数

1. 代码

二、分解质因数

1. 质因数的概念

2. 代码

三、筛质数——获取1~n中所有质数的个数

1. 合数的概念

2. 代码


一、判定质数

1. 代码

#include <iostream>
using namespace std;

bool is_prime(int x)
{
    // 1不是质数, 需要特判
    if (x == 1) return 0;
    // i从2枚举到根号x
    for (int i = 2; i <= x / i; i ++ )
        if (x % i == 0) return 0;
    return 1;
}

int main()
{
	int n;
    cin >> n;
    
    while (n -- )
    {
        int a;
        cin >> a;
        cout << (is_prime(a) ? "Yes" : "No") << endl;
    }
    
    return 0;
}

二、分解质因数

1. 质因数的概念

 这道题的目的是找到x这个数的质因数的底数和指数。例如280这个数,可以看成2^3 * 5^1 * 7^1,其中2、5和7分别是三个质因数的底数,3、1、1分别是三个质因数的指数。

2. 代码

#include <iostream>
using namespace std;

// 假设拆280
void decompose(int x)
{
    // i从2枚举到根号x
    for (int i = 2; i <= x / i; i ++ )
    {
        if (x % i == 0)
        {
            // s代表质数i的个数
            int s = 0;
            while (x % i == 0) s ++, x /= i;
            cout << i << " " << s << endl;
        }
    }
    
    // 质数x和它的个数1
    if (x > 1) cout << x << " " << 1 << endl;
}

int main()
{
    int n;
    cin >> n;
    
    while (n -- )
    {
        int x;
        cin >> x;
        // 拆解x
        decompose(x);
        cout << endl;
    }
    
    return 0;
}

三、筛质数——获取1~n中所有质数的个数

1. 合数的概念

质数和合数是一对相反的概念; 质数是除数只有1和它本身, 合数是除了1和它本身还有别的除数。

2. 代码

#include <iostream>
using namespace std;
 
const int N = 1e6 + 10;
 
// vis[i]代表i这个数是否是合数; vis[4]=1代表4这个数是合数, vis[3]=0代表3这个数不是合数, 是质数
// prime数组记录所有的质数, prime[i]代表第i个质数的值; prime[1]=2代表1~n第一个质数是2
// cnt记录prime数组中质数的个数, 也就是1~n中所有质数的个数
int vis[N], primes[N], cnt;
 
// 获取1~n所有的质数, 存储在prime数组中
void get_primes(int n)
{
    // 从2开始枚举所有数
    for (int i = 2; i <= n; i ++ )
    {
        // 如果i是质数, 记录下来
        if (!vis[i]) primes[ ++ cnt] = i;
        // 不管i是质数还是合数, i*prime[j]一定是合数; i*prime[j]有可能爆int, 把它的结果提升成long long
        for (int j = 1; 1LL * i * primes[j] <= n; j ++ )
        {
            // 记录i*prime[j]是合数
            vis[i * primes[j]] = 1;
            // 如果i是质数, prime[j]就是它本身; 如果i是合数, prime[j]是它的除数中的最小质数
            if (i % primes[j] == 0) break;
        }
    }
}
 
int main()
{
    int n;
    cin >> n;
    
    // 获取1~n中所有的质数
    get_primes(n);
    
    // 输出1~n中所有质数的个数
    cout << cnt << endl;
    
    return 0;
}

标签:prime,cout,int,质数,板子,质因数,合数
From: https://blog.csdn.net/m0_67839004/article/details/141034080

相关文章

  • 洛谷 P2731 骑马修栅栏 Riding the Fences之欧拉路径板子
    洛谷P2731题解传送锚点摸鱼环节[USACO3.3]骑马修栅栏RidingtheFences题目背景FarmerJohn每年有很多栅栏要修理。他总是骑着马穿过每一个栅栏并修复它破损的地方。题目描述John是一个与其他农民一样懒的人。他讨厌骑马,因此从来不两次经过一个栅栏。John的农场上......
  • 欧拉筛线性筛质数
    欧拉筛线性筛质数经典题解我的乱搞筛法和欧拉线性筛法的速度对比:模版code#include<bits/stdc++.h>usingnamespacestd;constintmaxn=100000009;boola[100000009];intread(){intx=0,f=1;charch=getchar();while(!isdigit(ch)){if(ch=='-')f=-1;ch=ge......
  • 洛谷 P3870 开关之线段树板子
    洛谷P3870题解传送锚点摸鱼环节[TJOI2009]开关题目描述现有\(n\)盏灯排成一排,从左到右依次编号为:\(1\),\(2\),……,\(n\)。然后依次执行\(m\)项操作。操作分为两种:指定一个区间\([a,b]\),然后改变编号在这个区间内的灯的状态(把开着的灯关上,关着的灯打开);指定一个区间......
  • 8.9 线段树板子+三分补题+三维的bfs
    nowcoder训练区间线段树板子题,我们只需要把区间每一个点设置成1,然后修改的时候直接改点,然后查区间就行线段树维护最大字段和/01串最大连续1的个数模板题。把白色和黑色看成1/0两个数就行了。#include<bits/stdc++.h>usingnamespacestd;usingi64=longlon......
  • 大质数分解模板
    jiangly的(偷一下i64mul(i64a,i64b,i64m){returnstatic_cast<__int128>(a)*b%m;}i64power(i64a,i64b,i64m){i64res=1%m;for(;b;b>>=1,a=mul(a,a,m))if(b&1)res=mul(res,a,m);......
  • leetcode数论(2521. 数组乘积中的不同质因数数目)
    前言经过前期的基础训练以及部分实战练习,粗略掌握了各种题型的解题思路。现阶段开始专项练习。数论包含最大公约数(>=2个数)、最大公约数性质、最小公倍数、区间范围质因素计数(最下间隔)、质因素分解、判断质数、平方根、立方根、互质、同余等等。描述给你一个正整数数组......
  • 筛选质数的三个方法:1.素数判断,2埃氏法,3欧拉法。
    文章目录前言一、素数是什么?二、算法使用原理1.合数:合数除了1和它本身以外,还有其他因数。与素数相对,素数只有1和它本身两个因数,而合数则至少有三个因数。2.我们理解了合数的概念后,可以知道一个合数可以由至少三个因数构成如,6=1*2*3,说明所有素数的倍数都可以是合数,那么我......
  • 镜面质数 题解
    题目id:20313题目描述如果一个质数镜像反转(即将该数各个位上数字反转)后仍然是质数,那么就称这个质数为镜像质数。例如质数\(13\)反转后为\(31\),则\(13\)为一个镜像质数。现在给定一个整数\(N\),请求出整数\(1\simN\)范围内有几个镜像质数。注意:求范围内的镜像质数时,质数和镜像反......
  • leetcode数论(2523. 范围内最接近的两个质数)
     前言经过前期的基础训练以及部分实战练习,粗略掌握了各种题型的解题思路。现阶段开始专项练习。描述给你两个正整数 left 和 right ,请你找到两个整数 num1 和 num2 ,它们满足:left<=nums1<nums2<=right  。nums1 和 nums2 都是 质数 。nums2-nums1......
  • 点分治板子
    #define_CRT_SECURE_NO_WARNINGS#include<iostream>#include<vector>#include<algorithm>#include<math.h>#include<sstream>#include<string>#include<string.h>#include<iomanip>#include<stdlib.h>#inc......