首页 > 编程语言 >c++算法学习笔记 (15) 质数

c++算法学习笔记 (15) 质数

时间:2024-03-21 16:58:37浏览次数:24  
标签:输出 return int 质数 c++ 15 质因数 正整数

1.试除法判断某个数是否为质数

#include <iostream>
using namespace std;
const int N = 50005;
bool is_prime1(int n)
{ // 暴力写法:O(n)
    if (n < 2)
        return false;
    for (int i = 2; i < n; i++)
    {
        if (n % i == 0)
            return false;
    }
    return true;
}
// 优化,每次只枚举较小的一个约数
bool is_prime2(int n)
{ // O(根号n)
    if (n < 2)
        return false;
    for (int i = 2; i <= n / i; i++)
    {
        if (n % i == 0)
            return false;
    }
    return true;
}
int main()
{

    return 0;
}

2. 分解质因数

给定 n 个正整数 ai,将每个数分解质因数,并按照质因数从小到大的顺序输出每个质因数的底数和指数。

输入格式

第一行包含整数 n。

接下来 n 行,每行包含一个正整数 ai。

输出格式

对于每个正整数 ai,按照从小到大的顺序输出其分解质因数后,每个质因数的底数和指数,每个底数和指数占一行。

每个正整数的质因数全部输出完毕后,输出一个空行。

数据范围

1≤n≤100
2≤ai≤2×10^9

输入样例:
2
6
8
输出样例:
2 1
3 1

2 3

 

#include <iostream>
using namespace std;
const int N = 50005;
void divide1(int n)
{
    for (int i = 2; i <= n; i++) // 底数一定为质数(因为从小到大枚举)
    {                            // 暴力 O(n)
        if (n % i == 0)
        {
            int s = 0;
            while (n % i == 0)
            {
                n /= i;
                s++;
            }
            cout << i << " " << s << endl; // 底数,指数
        }
    }
    cout << endl;
}
// 优化:n中最多只包含一个大于sqrt(n)的质因子(反证:如果有两个,则乘起来>n)
void divide2(int n)
{
    for (int i = 2; i <= n / i; i++)
    { // O(logn)~O(根号n)
        if (n % i == 0)
        {
            int s = 0;
            while (n % i == 0)
            {
                n /= i;
                s++;
            }
            cout << i << " " << s << endl; // 底数,指数
        }
    }
    if (n > 1)                         // 最后剩下的数要么为1,要么为大于sqrt(n)的质因子
        cout << n << " " << 1 << endl; // 特殊处理即可
    cout << endl;
}
int main()
{
    int n;
    cin >> n;
    while (n--)
    {
        int x;
        cin >> x;
        divide2(x);
    }
    return 0;
}

3. 筛质数​​​​​​​

给定一个正整数 n,请你求出 1∼n中质数的个数。

输入格式

共一行,包含整数 n。

输出格式

共一行,包含一个整数,表示 1∼n 中质数的个数。

数据范围

1≤n≤10^6

输入样例:
8
输出样例:
4

 

#include <iostream>
using namespace std;
const int N = 1000010;
int primes[N], cnt;
bool st[N];
void get_primes1(int n)
{ // O(lnn)
    for (int i = 2; i <= n; i++)
    {
        if (st[i] == 0)
        {
            primes[cnt++] = i; // 存质数
        }

        for (int j = i + i; j <= n; j += i)
        {
            st[j] = true; // 将i的倍数删去
        }
    }
}
// 优化:不必枚举2~p-1,只需枚举里面的质数
void get_primes2(int n) // 埃氏筛:原理:在朴素筛法的过程中只用质数项去筛.
{                       // O(nloglogn)
    for (int i = 2; i <= n; i++)
    {
        if (st[i] == 0)
        {
            primes[cnt++] = i;
            for (int j = i + i; j <= n; j += i)
            {
                st[j] = true; // 将i的倍数删去
            }
        }
    }
}
int main()
{
    int n;
    cin >> n;
    get_primes2(n);
    cout << cnt << endl;
    return 0;
}

标签:输出,return,int,质数,c++,15,质因数,正整数
From: https://blog.csdn.net/l141930402/article/details/136911452

相关文章

  • 判断一个数是否为质数
    首先我们要知道质数的定义:一个数只有1和它本身的数称为质数。接下来利用这一性质来写判断质数的代码。packagecom.ty.java;importjava.util.Scanner;publicclassDay2{publicstaticvoidmain(String[]args){Scannery=newScanner(System.in)......
  • C++ 纯虚函数
    纯虚函数优点防止派生类忘记实现虚函数,纯虚函数使得派生类必须实现基类的虚函数。在某些场景下,创建基类对象是不合理的,含有纯虚拟函数的类称为抽象类,它不能直接生成对象。声明方法:在基类中纯虚函数的方法的后面加=0。virtualvoidfuntion()=0;virtualstd::stringGetN......
  • C++ 空基类优化
    1.继承体系中的内存模型我们都知道,在C++中,不存在大小是零的类。即便是空类,也要占据一个字节,否则无法比较两个空类对象是否是同一个对象(在C/C++中,默认使用地址来判断两个变量是否是同一个)。classBaseEmpty{public: BaseEmpty(){std::cout<<"Baseaddress:"<<this......
  • 求一个资深 Windows客户端开发工程师(20k-40k *15薪)
    公司:深圳迅雷 项目:光影魔术手发布于2004年,是一款简单易用的PC端图片编辑软件,拥有数百万用户。2024年“光魔”作为公司重点项目再启航,老产品碰撞新AI技术为用户提供更佳的体验,现广纳贤才,欢迎你的加入,一起做出更优质的产品。职责:1.负责PC客户端相关产品的研发工作;2.负责......
  • c/c++|gdb 单点调试 | 多点调试|查看栈中信息|具体变量
    设置断点,有什么好处,废话就不说了,可以去看手册设置断点,参考bxxx.cpp:n某个源文件的某行bfunc1调试某个函数编译g++test_gdb_watch.cpp-g设置断点bpowerr出现报错Missingseparatedebuginfos,use:debuginfo-installglibc-2.17-326.el7_9.x86_64libg......
  • C++ 对象模型
    1.普通类对象是什么布局?structBase{Base()=default;~Base()=default;voidFunc(){}inta;intb;};intmain(){Basea;return0;}2.带虚函数的类对象是什么布局?structBase{Base()=default;virtual~Base()......
  • c++模板
    前言大家好,我是jiantaoyab,这篇文章给大家带来c++模板的介绍,模板是泛型程序设计的基础,模板就是类或者函数的蓝图,后一篇文章我将开始介绍STL,模板在STL中大量的运用。模板分为函数模板和类模板函数模板格式template<typenameT1,typenameT2,......,typenameTn>//参数......
  • C++ 合成默认构造函数
    问题:C++面向对象编程时,如果我们没有声明任何构造函数constructor,按照以前最初学习,说编译器会自动合成一个默认的无参构造函数defaultconstructor,但是事实确实是这样吗,存不存在例外呢,即使有合成构造函数,那么它又将对类数据进行怎样的初始化呢?1.问题一如果我们没有声明任何构造......
  • C++ RTTI
    1.背景RTTI的英文全称是"RuntimeTypeIdentification",中文称为"运行时类型识别",它指的是程序在运行的时候才确定需要用到的对象是什么类型的。用于在运行时(而不是编译时)获取有关对象的信息。在C++中,由于存在多态行为,基类指针或者引用指向一个派生类,而其指向的真正类型,在编译阶......
  • C++标准库容器选择
    C++标准库提供了多种容器,每种容器都有其自身的特点和适用场景。以下是C++标准库中常用的容器以及它们的特点:std::vector:动态数组,支持随机访问,适用于需要快速随机访问元素的场景。std::list:双向链表,支持快速插入和删除操作,适用于需要频繁插入和删除元素的场景。std::deque......