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

数论——质数

数论——质数

质数(素数)

一个大于1的自然数,除了1和它本身外,不能被其他自然数整除,换句话说就是该数除了1和它本身以外不再有其他的因数,这个数就是质数。

1.试除法(O(sqrt(n)))

思想

一个数 x 分解成两个数的乘积,则这两个数中,一定有一个数大于根号 x,一个数小于根号x。

所以,可以用 x 除以 2 ~ 根号x 中的每个数,如果出现了余数为 0,则这个数不是质数,如果没有出现余数为 0,则这个数是质数。

代码
  1. 判断质数
#include <cmath>
#include <cstdio>using namespace std;bool is_prime(int x) {if (x < 2)	return false;for (int i = 2; i <= sqrt(x); i ++) if (x % i == 0)return false;return true;
}int main() {int n;scanf("%d", &n);while (n --) {int x;scanf("%d", &x);if (is_prime(x))puts("Yes");elseputs("No");} return 0;
}
  1. 分解质因数
输入格式

第一行包含整数 n。

接下来 n行,每行包含一个正整数 a i a_i ai

输出格式

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

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

输入样例:
2
6
8
输出样例:
2 1
3 12 3
#include <iostream>using namespace std;void divide(int x) {for (int i = 2; i <= x / i; i ++) if (x % i == 0) {int s = 0;while (x % i == 0) {++ s;x /= i;}cout << i << ' ' << s << endl;}if (x > 1)	cout << x << ' ' << 1 << endl;cout << endl;	
}int main() {int n;cin >> n;while (n --) {int x;cin >> x;divide(x);}return 0;
}

2.筛法

  1. 埃氏筛法 O ( n l o g l o g n ) O(nloglogn) O(nloglogn) (调和级数+欧拉常数证明)
// 埃氏筛 
void get_primes(int n) {for (int i = 2; i <= n; i ++) {if (!st[i]) {primes[cnt ++] = i;for (int j = i + i; j <= n; j += i)st[j] = true;}}
}
  1. 欧式筛法(线性筛) O ( n ) O(n) O(n)
// 线性筛
void get_primes(int n) {for (int i = 2; i <= n; i ++) {if (!st[i])	primes[cnt ++] = i;for (int j = 0; primes[j] <= n / i; j ++) {st[primes[j] * i] = true;if (i % primes[j] == 0)	break;}}
} 

证明

  • 2-n的每一个合数都会被其最小质因子筛掉
    • i % p[j] == 0:p[j] 一定是 i 的最小质因子,所以 p[j] 一定是 p[j]*i 的最小质因子。
    • i % p[j] != 0: p[j] 一定小于 i 的最小质因子,所以 p[j] 一定是 p[j]*i 的最小质因子。

代码

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

#include <iostream>using namespace std;const int N = 1e6 + 10;int primes[N], cnt;
bool st[N];// 线性筛
void get_primes(int n) {for (int i = 2; i <= n; i ++) {if (!st[i])	primes[cnt ++] = i;for (int j = 0; primes[j] <= n / i; j ++) {st[primes[j] * i] = true;if (i % primes[j] == 0)	break;}}
} int main() {int n;cin >> n; get_primes(n);cout << cnt << endl;return 0;
}

为什么不需要写 j < c n t j<cnt j<cnt

  • primes数组中存有小于等于 i 的所有质数
  • 当 i 是合数, p[j] 为 i 的最小质因子时 break
  • 当 i 是质数, p[j] 为 i 时 break

相关文章:

  • Mysql 日期函数大全
  • C语言期末考试复习PTA数据类型及表达式-分支结构程序-循环结构-数组经典选择题
  • 渗透测试学习day6
  • 第二十一章总结
  • HDFS常见题
  • ALTERNET STUDIO 9.1 Crack
  • 在Pytorch中使用Tensorboard可视化训练过程
  • jmeter接口自动化部署jenkins教程
  • 网站高性能架构设计——web前端与池化
  • hbuilder + uniapp +vue3 开发微信云小程序
  • 爬虫框架Scrapy
  • scrapy介绍,并创建第一个项目
  • 网上商城、宠物商城源码(Java)
  • 1.查看表的基本结构,表的详细结构和修改表名
  • CSS video控件去掉视频播放条
  • Flannel解读
  • IOS评论框不贴底(ios12新bug)
  • Js基础知识(四) - js运行原理与机制
  • Redis学习笔记 - pipline(流水线、管道)
  • scrapy学习之路4(itemloder的使用)
  • socket.io+express实现聊天室的思考(三)
  • 关于Flux,Vuex,Redux的思考
  • 简单数学运算程序(不定期更新)
  • 开源地图数据可视化库——mapnik
  • 前端设计模式
  • 手机端车牌号码键盘的vue组件
  • 译有关态射的一切
  • 中文输入法与React文本输入框的问题与解决方案
  • “十年磨一剑”--有赞的HBase平台实践和应用之路 ...
  • ​Linux Ubuntu环境下使用docker构建spark运行环境(超级详细)
  • ​Spring Boot 分片上传文件
  • #!/usr/bin/python与#!/usr/bin/env python的区别
  • #define MODIFY_REG(REG, CLEARMASK, SETMASK)
  • #我与Java虚拟机的故事#连载08:书读百遍其义自见
  • (12)Hive调优——count distinct去重优化
  • (Redis使用系列) SpringBoot中Redis的RedisConfig 二
  • (八)Flask之app.route装饰器函数的参数
  • (十六)串口UART
  • (原創) X61用戶,小心你的上蓋!! (NB) (ThinkPad) (X61)
  • (原創) 如何讓IE7按第二次Ctrl + Tab時,回到原來的索引標籤? (Web) (IE) (OS) (Windows)...
  • (原創) 如何優化ThinkPad X61開機速度? (NB) (ThinkPad) (X61) (OS) (Windows)
  • .gitattributes 文件
  • .NET 4.0中的泛型协变和反变
  • .Net MVC4 上传大文件,并保存表单
  • .net web项目 调用webService
  • /etc/fstab和/etc/mtab的区别
  • @Autowired自动装配
  • [ C++ ] STL_list 使用及其模拟实现
  • [2019.2.28]BZOJ4033 [HAOI2015]树上染色
  • [Angular 基础] - 自定义指令,深入学习 directive
  • [DP 训练] Longest Run on a Snowboard, UVa 10285
  • [hibernate]基本值类型映射之日期类型
  • [hive]中的字段的数据类型有哪些
  • [IDF]摩斯密码
  • [IE编程] IE8的SDK 下载