质数——acwing

devtools/2024/11/29 15:11:15/

素数几种方法(区间筛)-CSDN博客

之前做的笔记👆👆👆

题目一:试除法判定质数

866. 试除法判定质数 - AcWing题库

代码 

#include<bits/stdc++.h>
using namespace std;bool isprime(int x) {if(x == 1) return false;for(int i = 2; i<=x/i; i ++) { // i*i可能越界,开方函数太慢if(x%i==0) return false;}return true;
}int main() {int n;cin >> n;while(n --) {int x;cin >> x;if(isprime(x)) puts("Yes");else puts("No");}return 0;
}

题目二:分解质因数

867. 分解质因数 - AcWing题库

 代码(TLE )

11个数据过了7个

从质因数从2开始,只要x能被除就不断除,可以被除的条件是,x%i==0; 还有个条件是x!=1,是因为x除到最后一定为1,也是循环结束条件。

分析题目会发现:

只要x本身是质数那么只会被本身除掉。

如果不是质数,例如8,22,16,9等等,都会被他们的质因数不断除。例如27.

27/3 = 9, 9/3 = 3, 3/3 = 1;

#include<bits/stdc++.h>
using namespace std;void solve(int x) {for(int i = 2; x!=1 && i <= x; i ++) {int cnt = 0;while(x%i==0) {cnt ++;x /= i;}if(cnt) {cout << i << " " << cnt << endl;}}
}int main() {int n; cin >> n;while(n --) {int x; cin >> x;solve(x);cout << endl;}return 0;
}

代码2

x除以质因子,除到后面会发现,从例子可以看出来,他只会不断除以一个质因子,然后剩下一个质因子。那个质因子是大于sqrt(x)的也是唯一 一个。

28 /2 = 14, 14/2 = 7    => 7*7=49>28,明显最后一个质因子是大于的。

而质数本身就是最大的那个质因子,也就是上面除剩下的。其实是因为前面跳过了sqrt前面的质因子环节

所以只要循环找sqrt前面的质因子,除剩下单独处理。

或者说:

只会有一个质因子是超过sqrt(x)的,也就是要单独处理。

其他就不断处理[2,sqrt(x)]的质因子。

#include<bits/stdc++.h>
using namespace std;void solve(int x) {// 遍历,不断找质因子 遍历【2,sqrt(x)]for(int i = 2; i <= x/i; i ++) {if(x%i==0) {int cnt = 0;while(x%i==0) {x /= i;cnt ++;}cout << i << " " << cnt << endl;}}// 剩下一个质数if(x>1) cout << x << " " << 1 << endl;
}int main() {int n; cin >> n;while(n --) {int x; cin >> x;solve(x);puts("");}return 0;
}

题目三:筛质数

868. 筛质数 - AcWing题库

代码 (欧拉筛)

#include<bits/stdc++.h>
using namespace std;const int N = 1e6+10;
int prime[N], cnt; // 存素数
bool vis[N]; // 标记素数
// 欧拉筛void solve(int n) {for(int i = 2; i <= n; i ++) {if(vis[i]) prime[cnt++] = i;for(int j = 0; j < cnt && i*prime[j]<=n; j ++) {vis[i*prime[j]] = false;if(i%prime[j]==0) break;}}
}int main() {int n;cin >> n;memset(vis,true,sizeof vis);solve(n);cout << cnt << endl;return 0;
}

代码2(埃氏筛)

#include<bits/stdc++.h>
using namespace std;const int N = 1e6+10;
int prime[N], cnt;
bool vis[N];// 埃氏筛,用质因子来筛
void solve(int n) {for(int i = 2; i <= n/i; i ++) {if(vis[i]) {for(int j = 2*i; j <= n; j += i) {vis[j] = false;}}}for(int i = 2; i <= n; i ++) {if(vis[i]) prime[cnt++] = i;}
}int main() {int n;cin >> n;memset(vis,true,sizeof vis);solve(n);cout << cnt << endl;return 0;
}


http://www.ppmy.cn/devtools/137948.html

相关文章

C++学习日记---第13天(类和对象---封装)

笔记复习 1.类和对象 c面向对象的三大特性为&#xff1a;封装&#xff0c;继承&#xff0c;多态 c认为万事万物都皆为对象&#xff0c;对象上有其属性和行为 具有相同性质的对象&#xff0c;我们可以抽象为称为类 2.封装 作用&#xff1a;将属性和行为作为一个整体&#xf…

arm Rk1126 编译Qt工程报错: Could not find qmake spec

首先修改qmake.conf文件&#xff0c;配置好正确的交叉编译工具&#xff1a; 然后执行编译&#xff1a; /opt/Rv1126/Rv1126-盒子代码/rv1126-qt5-sdk/bin/qmake untitled.pro 报错。 原因&#xff1a;中文路径。修改路径为英文路径即可

【R库包安装】R库包安装总结:conda、CRAN等

【R库包安装】R库包安装总结&#xff1a;conda、CRAN等 方法1&#xff1a;基于 R 的 CRAN 仓库安装CRAN库包查询从 CRAN 安装 方法2&#xff1a;使用conda安装库包确保已安装 R 和 Conda 环境使用 Conda 官网浏览是否存在相应库包Conda 安装 R 库 方法3&#xff1a;从 GitHub 安…

Linux进程基础

前言&#xff1a;并行和并发 1.并发&#xff1a;在操作系统中是指一个时间段中有几个进程都处于正在运行到运行完毕之间&#xff0c;且它们都是在同一个处理器上运行的&#xff0c;抢占了共享的这个CPU资源 在用户的视角上&#xff0c;这些进程看似同时进行&#xff0c;但不是…

QT6学习第四天 感受QT的文件编译

QT6学习第四天 感受QT的文件编译 使用纯代码编写程序新建工程 使用其他编辑器纯代码编写程序并在命令行运行使用 .ui 表单文件生成界面使用自定义 C 窗口类使用现成的QT Designer界面类 使用纯代码编写程序 我们知道QT Creator中可以用拖拽的方式在 .ui 文件上布局&#xff0c…

【计算机网络】计算机网络概述

当我们决定要谈谈网络的时候&#xff0c;我想在谈之前&#xff0c;有必要了解一下“协议”这个词。协议&#xff0c;定义了在俩个或者多个通信实体之间交换报文的格式和次序&#xff0c;以及报文发送、接收报文或者其他的事件所采取的动作。定义都比较晦涩&#xff0c;那就让我…

QML学习 —— 33、弹出式菜单(附源码)

效果 说明 Menu菜单类型为本机平台菜单弹出式菜单提供QML API。 代码 import QtQuick 2.12 import QtQuick.Window 2.12 import QtQuick.Controls 2.5 import QtQuick.Layouts 1.12Window {id: rootvisible:

解决Ubuntu下无法远程登录

1.检查 SSH 服务状态&#xff1a; sudo systemctl status ssh.service ssh服务状态正常 2.查看是否安装了SSH服务&#xff08;如果显示为空则没安装&#xff09; sudo ps -e |grep ssh 3.安装openssh-server sudo apt-get install openssh-server 4.查看是否安装成功 su…