当前位置: 首页 > news >正文

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 12 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的倍数删去}}}
}
// 线性筛法
void get_primes3(int n)
{ // 原理:1~n之内的任何一个合数一定会被筛掉,而且筛的时候只用最小质因子来筛,// 然后每一个数都只有一个最小质因子,因此每个数都只会被筛一次,因此线性筛法是线性的.for (int i = 2; i <= n; i++){if (st[i] == 0){primes[cnt++] = i;}for (int j = 0; primes[j] <= n / i; j += i){st[primes[j] * i] = true;if (i % primes[j] == 0)break;}}
}
int main()
{int n;cin >> n;get_primes2(n);cout << cnt << endl;return 0;
}

相关文章:

  • 新手如何入门电子电路
  • 我的VSCode配置和常见插件
  • 探秘开源隐语:架构深度剖析与隐私计算技术之旅
  • 解读 Xend Finance:向 RWA 叙事拓展,构建更具包容性的 DeFi 体系
  • c++类型转换(持续更新)
  • 七仔充电桩平台 二轮电动自行车 四轮汽车 云快充1.5 云快充1.6
  • #鸿蒙生态创新中心#揭幕仪式在深圳湾科技生态园举行
  • 点云从入门到精通技术详解100篇-点云采样理论知识详解
  • C# 右键快捷菜单(上下文菜单)的两种实现方式
  • 数据结构——循环队列的实现
  • 【嵌入式硬件】步进电机
  • QT网络编程之实现UDP广播发送和接收(多网卡,多IP)
  • Spring常用设计模式-实战篇之单例模式
  • vue父子组件生命周期
  • vue3 + ts +element-plus + vue-router + scss + axios搭建项目
  • [译] React v16.8: 含有Hooks的版本
  • ES6, React, Redux, Webpack写的一个爬 GitHub 的网页
  • golang中接口赋值与方法集
  • input的行数自动增减
  • JAVA并发编程--1.基础概念
  • Js实现点击查看全文(类似今日头条、知乎日报效果)
  • LeetCode18.四数之和 JavaScript
  • mac修复ab及siege安装
  • mockjs让前端开发独立于后端
  • MySQL Access denied for user 'root'@'localhost' 解决方法
  • Netty源码解析1-Buffer
  • python_bomb----数据类型总结
  • thinkphp5.1 easywechat4 微信第三方开放平台
  • 第十八天-企业应用架构模式-基本模式
  • 关于字符编码你应该知道的事情
  • 用 vue 组件自定义 v-model, 实现一个 Tab 组件。
  • 鱼骨图 - 如何绘制?
  • 深度学习之轻量级神经网络在TWS蓝牙音频处理器上的部署
  • 从如何停掉 Promise 链说起
  • ​【已解决】npm install​卡主不动的情况
  • #传输# #传输数据判断#
  • (10)Linux冯诺依曼结构操作系统的再次理解
  • (Pytorch框架)神经网络输出维度调试,做出我们自己的网络来!!(详细教程~)
  • (附源码)springboot宠物管理系统 毕业设计 121654
  • (附源码)springboot太原学院贫困生申请管理系统 毕业设计 101517
  • (附源码)基于SpringBoot和Vue的厨到家服务平台的设计与实现 毕业设计 063133
  • (论文阅读32/100)Flowing convnets for human pose estimation in videos
  • (牛客腾讯思维编程题)编码编码分组打印下标题目分析
  • (四)linux文件内容查看
  • (学习日记)2024.04.10:UCOSIII第三十八节:事件实验
  • (一)搭建springboot+vue前后端分离项目--前端vue搭建
  • (译)2019年前端性能优化清单 — 下篇
  • .naturalWidth 和naturalHeight属性,
  • .NET/C# 判断某个类是否是泛型类型或泛型接口的子类型
  • .net2005怎么读string形的xml,不是xml文件。
  • .NET开源快速、强大、免费的电子表格组件
  • .NET设计模式(11):组合模式(Composite Pattern)
  • .NET下的多线程编程—1-线程机制概述
  • .pyc文件是什么?
  • /etc/sudoers (root权限管理)