因子分解(递归)
1.素分解式(简单版)
任务描述
编写函数,输出一个正整数的素数分解式。主函数的功能为输入若干正整数(大于1),输出每一个数的素分解式。素数分解式是指将整数写成若干素数(从小到大)乘积的形式。例如:
20=2*2*5
36=2*2*3*3
53=53
输入样例:
6 10 24 100 1000 1001 1002001
输出样例:
6=2*3
10=2*5
24=2*2*2*3
100=2*2*5*5
1000=2*2*2*5*5*5
1001=7*11*13
1002001=7*7*11*11*13*13
解题思路:
从小到大遍历因子,只需找到一组因子对,然后递归分解这组因子对直到最小素数就行
参考代码:
#include<stdio.h>
void isprime(int a)
{for(int i=2;i*i<=a;i++){if(a%i==0){isprime(i);//递归分解因子printf("*");isprime(a/i);return;}}printf("%d",a);
}
int main()
{int a;while(~scanf("%d",&a)){printf("%d=",a);isprime(a);printf("\n");}return 0;
}
2.素分解式(进阶版)
任务描述
编写函数,输出一个正整数的升级版素数分解式。主函数的功能为输入若干正整数(大于1),输出每一个数的升级版素数分解式。素数分解式是指将整数写成若干素数(从小到大)乘积的形式。升级版素数分解式是指将整数写成若干素数(从小到大)乘积的形式,每个素数只输出1次,后面加上其乘方(1次方省略不输出),具体格式见输出样例。
输入样例:
1000 1001 1002 1003 1004 1005 1006 1007 1008
输出样例:
1000=2^3*5^3
1001=7*11*13
1002=2*3*167
1003=17*59
1004=2^2*251
1005=3*5*67
1006=2*503
1007=19*53
1008=2^4*3^2*7
解题思路:
与上一题相比也就是加上了需要以指数的形式表示,就需要设一个变量去计数
参考代码:
这是第一版,写的有些乱,但思路很好理解:
#include<stdio.h>
#include<stdbool.h>
bool isprime(int a)//判断质数,是否最简
{if(a==1)return false;if(a==2)return true;for(int i=2;i*i<=a;i++){if(a%i==0)return false;}return true;
}
void solve(int n)
{int a=2,t=0;//t用于控制输出乘号,a是被遍历的可能的因子if(isprime(n))//如果本身就为素数就不必再找因子了{printf("%d",n);return;}while(n>1){int count=0;//统计该因子幂次while(n%a==0){n/=a;count++;}if(count)//若count不为0,也就是a为因子时{if(t)//如果不是第一个因子输出,控制输出格式的printf("*");t++;printf("%d",a);//输出因子if(count>1)//若幂次大于1,输出幂次printf("^%d",count);}do{a++;}while(!isprime(a)&&a<=n);//a往后推至下一个素数,且a不能大于要被分解的nif(a>n)//a大于n了就跳出循环break;if(isprime(n))//剩下的n为质数也跳出break;}if(n!=1)//此时剩下的n必定为最简因子printf("*%d",n);
}
int main()
{int n;while(~scanf("%d",&n)){printf("%d=",n);solve(n);printf("\n");}return 0;
}
优化版:
#include<stdio.h>// 递归函数,用于分解质因数并显示指数
void isprime(int a, int count) {for (int i = 2; i * i <= a; i++) {if (a % i == 0) {// 统计当前质因数的幂次int exponent = 0;while (a % i == 0) {a /= i;exponent++;}// 递归处理剩余部分if (count == 0) {//count等于0,说明为第一个因子printf("%d", i);} else {printf("*%d", i);}if (exponent > 1) {printf("^%d", exponent);}// 继续分解剩余部分isprime(a, 1);return;}}// 如果 a 是质数,直接输出if (a > 1) {if (count == 0) {printf("%d", a);} else {printf("*%d", a);}}
}int main() {int a;while (~scanf("%d", &a)) {printf("%d=", a);isprime(a, 0); // 调用递归函数进行质因数分解printf("\n");}return 0;
}
3.最大质因子序列
题目描述
任意输入两个正整数m, n (1 < m < n <= 5000),依次输出m到n之间每个数的最大质因子(包括m和n;如果某个数本身是质数,则输出这个数自身)。
输入格式
一行,包含两个正整数m和n,其间以单个空格间隔。
输出格式
一行,每个整数的最大质因子,以逗号间隔。
样例输入
5 10
样例输出
5,3,7,2,3,5
解题思路:
遍历每一个数,判断其中的因子比较得出最大质因子,思路很简单
参考代码:
初版:
#include<iostream>
using namespace std;
bool isprime(int x)//判断是否为素数因子
{if(x<=1)return false;if(x==2)return true;for(int i=2;i*i<=x;i++){if(x%i==0)return false;}return true;
}
int isrpime(int x)//判断因子并比较出最大因子
{int max=0;for(int i=2;i*i<=x;i++){if(x%i==0){if(isprime(i))max=max<i?i:max;if(isprime(x/i))max=max<(x/i)?(x/i):max;}}return max;
}
void solve(int m,int n)
{int t=0,x=0;for(int i=m;i<=n;i++){if(isprime(i))//如果遍历到的数本身就为素数,则直接输出{if(t)cout<<',';t++;cout<<i;}else//若不为素数,则从因子中寻找{x=isrpime(i);if(t)cout<<',';t++;cout<<x;}}
}
int main()
{int m,n;cin>>m>>n;solve(m,n);return 0;
}
用递归美化版:
#include <iostream>
using namespace std;// 判断一个数是否为质数
bool isprime(int x) {if (x <= 1) return false;if (x == 2) return true;for (int i = 2; i * i <= x; i++) {if (x % i == 0) return false;}return true;
}// 递归函数:找到一个数的最大质因数
int maxPrimeFactorRecursive(int n) {// 如果 n 是质数,直接返回 nif (isprime(n)) {return n;}// 从 2 开始逐个检查因数for (int i = 2; i * i <= n; i++) {if (n % i == 0) {// 找到一个因数 i,递归找到 n/i 的最大质因数int factor1 = i;int factor2 = n / i;// 递归找到 factor2 的最大质因数int maxFactor = maxPrimeFactorRecursive(factor2);// 返回较大的质因数return max(factor1, maxFactor);}}// 如果没有找到因数,返回 n(理论上不会执行到这里)return n;
}// 输出 m 到 n 之间的质数和非质数的最大质因数
void solve(int m, int n) {int t = 0;for (int i = m; i <= n; i++) {if (isprime(i)) {if (t) cout << ',';t++;cout << i;} else {int maxFactor = maxPrimeFactorRecursive(i);if (t) cout << ',';t++;cout << maxFactor;}}cout << endl;
}int main() {int m, n;cin >> m >> n;solve(m, n);return 0;
}
4.素因子去重
题目描述
给定一个正整数n,求一个正整数p,满足p仅包含n的所有素因子,且每个素因子的次数不大于1
输入格式
一个整数,表示n<=10^12
输出格式
输出一行,包含一个整数p。
样例输入
1000
样例输出
10
解题思路:
- 题目别理解错,p是去重后素因子得乘积
- 还有本题数据较大,需要开long long
参考代码:
1.借用set容器的去重特性,筛出质因子,这种可能有些耗内存。
#include<iostream>
#include<set>
#include<vector>
using namespace std;
typedef long long ll;
set<ll>ans;//注意为long long
// 判断一个数是否为质数
bool isprime(ll x) {if (x <= 1) return false;if (x == 2) return true;for (int i = 2; i * i <= x; i++) {if (x % i == 0) return false;}return true;
}
void solve(ll n)//将质因数存入set容器,借由其出重特性去重
{for(int i=2;i*i<=n;i++){if(n%i==0){if(isprime(i))ans.insert(i);if(isprime(n/i)){ans.insert(n/i);}elsesolve(n/i);return;}}ans.insert(n);
}
int main()
{ll n;cin>>n;solve(n);ll p=1;for(auto m:ans){p=p*m;}cout<<p;return 0;
}
2.用递归优化掉判断素数的函数:
#include<iostream>
#include<set>
using namespace std;
typedef long long ll;
set<ll>ans;
void solve(ll n)
{for(int i=2;i*i<=n;i++){if(n%i==0){solve(i);//如果i为素数则不会进入该if分支solve(n/i);//同理,用递归的方式分解为素因子return;}}ans.insert(n);//素因子会在递归在到达这一句
}
int main()
{ll n;cin>>n;solve(n);ll p=1;for(auto m:ans){p=p*m;}cout<<p;return 0;
}
3.不使用set容器
#include<iostream>
using namespace std;
typedef long long ll;
int main()
{ll n;ll m=1;cin>>n;//从2开始,逐个检查是否为n的因子//如果 i 是 n 的因数,那么 i 必然是一个质数,因为如果 i 是一个合数,它必然可以被更小的质数整除,而这些质数已经在之前的循环中被处理过了for(ll i=2;i<=n/i;i++){if(n%i==0){m*=i;while(n%i==0){//将n中所有i的因子去除n=n/i;}}}if(n>1){m*=n;}cout<<m<<endl;return 0;
}
练习题目:
1.在这个页面,第7.7关 函数的应用,任务07-07-05 素分解式,任务07-07-08 升级版素分解式
2.https://www.dotcpp.com/oj/problem2967.html
3.https://www.dotcpp.com/oj/problem2966.html
4.https://www.dotcpp.com/oj/problem2221.html
相关文章:
因子分解(递归)
1.素分解式(简单版) 任务描述 编写函数,输出一个正整数的素数分解式。主函数的功能为输入若干正整数(大于1),输出每一个数的素分解式。素数分解式是指将整数写成若干素数(从小到大)乘积的形式。例如: 202*2*5 362*2*…...

【Python】pandas库---数据分析
大学毕业那年,你成了社会底层群众里,受教育程度最高的一批人。 前言 这是我自己学习Python的第四篇博客总结。后期我会继续把Python学习笔记开源至博客上。 上一期笔记有关Python的NumPy数据分析,没看过的同学可以去看看:【Pyt…...

RabbitMQ 的7种工作模式
RabbitMQ 共提供了7种⼯作模式,进⾏消息传递,. 官⽅⽂档:RabbitMQ Tutorials | RabbitMQ 1.Simple(简单模式) P:⽣产者,也就是要发送消息的程序 C:消费者,消息的接收者 Queue:消息队列,图中⻩⾊背景部分.类似⼀个邮箱,可以缓存消息;⽣产者向其中投递消息,消费者从其中取出消息…...

负载均衡式在线OJ
文章目录 项目介绍所用技术与开发环境所用技术开发环境 项目框架compiler_server模块compiler编译功能comm/util.hpp 编译时的临时文件comm/log.hpp 日志comm/util.hpp 时间戳comm/util.hpp 检查文件是否存在compile_server/compiler.hpp 编译功能总体编写 runner运行功能资源设…...

【3D打印机】启庞KP3S热床加热失败报错err6
最近天冷,打印机预热突然失败,热床无法加热,过了一段时间报错err6,查看另一篇资料说是天气冷原因,导致代码的PID控温部分达不到预期加热效果,从而自检报错,然后资料通过修改3D打印机代码的方式进…...
基于 MATLAB 的图像增强技术分享
一、引言 图像增强是数字图像处理中的重要环节,其目的在于改善图像的视觉效果,使图像更清晰、细节更丰富、对比度更高,以便于后续的分析、识别与理解等任务。MATLAB 作为一款功能强大的科学计算软件,提供了丰富的图像处理工具和函…...

前端知识补充—HTML
1. HTML 1.1 什么是HTML HTML(Hyper Text Markup Language), 超⽂本标记语⾔ 超⽂本: ⽐⽂本要强⼤. 通过链接和交互式⽅式来组织和呈现信息的⽂本形式. 不仅仅有⽂本, 还可能包含图⽚, ⾳频, 或者⾃已经审阅过它的学者所加的评注、补充或脚注等等 标记语⾔: 由标签构成的语⾔…...
安卓从Excel文件导入数据到SQLite数据库的实现
在现代的移动应用开发中,数据的处理和管理是至关重要的一环。有时候,我们需要从外部文件(如Excel文件)中导入数据,以便在应用程序中使用。本文将介绍如何在Android应用中使用Java代码从一个Excel文件中导入数据到SQLit…...
C/C++基础知识复习(44)
1) C 中多态性在实际项目中的应用场景 多态性是面向对象编程(OOP)中的一个重要特性,指的是不同的对象可以通过相同的接口来表现不同的行为。在 C 中,多态通常通过虚函数(virtual)和继承机制来实现。实际项…...

【day13】深入面向对象编程
【day12】回顾 在正文开始之前,先让我们回顾一下【day12】中的关键内容: 接口(Interface): interface关键字用于定义接口。implements关键字用于实现接口。 接口成员: 抽象方法:需要在实现类中…...
《 火星人 》
题目描述 人类终于登上了火星的土地并且见到了神秘的火星人。人类和火星人都无法理解对方的语言,但是我们的科学家发明了一种用数字交流的方法。这种交流方法是这样的,首先,火星人把一个非常大的数字告诉人类科学家,科学家破解这…...
盒子模型(内边距的设置)
所有元素都可以设置内边距属性和外边距属性大体相同,可参考上一篇,但有区别 内边距不能设置为负值padding-方向:尺寸 注意:使用内边距padding之后元素整体会变大,因为他是直接加上了内边距的大小,不改变元素…...

CentOS7网络配置,解决不能联网、ping不通外网、主机的问题
1. 重置 关闭Centos系统 编辑->虚拟网络编辑器 还原默认设置 2. 记录基本信息 查看网关地址,并记录在小本本上 查看网段,记录下 3. 修改网卡配置 启动Centos系统 非root用户,切换root su root查看Mac地址 ifconfig 或 ip addr记录下来 修改配置文件 vim /et…...

如何测继电器是否正常
继电器是一种电控制器件,广泛应用于自动控制、电力保护等领域。为了确保继电器的正常工作,定期检测其状态是非常必要的。以下是一些常用的方法来测试继电器是否正常工作: 1. 视觉检查: - 观察继电器的外观是否有损坏、变形或烧焦…...

最优二叉搜索树【东北大学oj数据结构10-4】C++
题面 最优二叉搜索树是由 n 个键和 n1 个虚拟键构造的二叉搜索树,以最小化搜索操作的成本期望值。 给定一个序列 Kk1,k2,...,kn,其中 n 个不同的键按排序顺序 ,我们希望构造一个二叉搜索树。 对于每个关键 ki,我们有一个…...
ESP32应用开发-Webserver
文章目录 库调用实例实现思路技术要点 1. 前端涉及的文件需要包装再发送2. http-GET路由3. http-POST路由 开发环境:Arduino 库调用 #include <WebServer.h> #include <ArduinoJson.h> //IDE没有自带,需自行安装实例 WebServer server…...

【IMU:视觉惯性SLAM系统】
视觉惯性SLAM系统简介 相机(单目/双目/RGBD)与IMU结合起来就是视觉惯性,通常以单目/双目IMU为主。 IMU里面有个小芯片可以测量角速度与加速度,可分为6轴(6个自由度)和9轴(9个自由度)IMU,具体的关于IMU的介…...

前端开发 之 12个鼠标交互特效下【附完整源码】
前端开发 之 12个鼠标交互特效下【附完整源码】 文章目录 前端开发 之 12个鼠标交互特效下【附完整源码】七:粒子烟花绽放特效1.效果展示2.HTML完整代码 八:彩球释放特效1.效果展示2.HTML完整代码 九:雨滴掉落特效1.效果展示2.HTML完整代码 十…...
Unity文件路径访问总结:从基础到高级的资源加载方法
在Unity开发中,文件路径的访问和资源加载是开发者经常需要处理的任务。无论是加载纹理、模型、音频,还是读取配置文件,正确地处理路径和资源加载是确保项目顺利运行的关键。本文将以Unity文件路径访问为主线,详细介绍Unity中常见的…...

AWS Transfer 系列:简化文件传输与管理的云服务
在数字化转型的今天,企业对文件传输、存储和管理的需求日益增长。尤其是对于需要大量数据交换的行业,如何高效、可靠地传输数据成为了一大挑战。为了解决这一难题,AWS 提供了一系列的文件传输服务,统称为 AWS Transfer 系列。这些…...

docker详细操作--未完待续
docker介绍 docker官网: Docker:加速容器应用程序开发 harbor官网:Harbor - Harbor 中文 使用docker加速器: Docker镜像极速下载服务 - 毫秒镜像 是什么 Docker 是一种开源的容器化平台,用于将应用程序及其依赖项(如库、运行时环…...
Java入门学习详细版(一)
大家好,Java 学习是一个系统学习的过程,核心原则就是“理论 实践 坚持”,并且需循序渐进,不可过于着急,本篇文章推出的这份详细入门学习资料将带大家从零基础开始,逐步掌握 Java 的核心概念和编程技能。 …...
汇编常见指令
汇编常见指令 一、数据传送指令 指令功能示例说明MOV数据传送MOV EAX, 10将立即数 10 送入 EAXMOV [EBX], EAX将 EAX 值存入 EBX 指向的内存LEA加载有效地址LEA EAX, [EBX4]将 EBX4 的地址存入 EAX(不访问内存)XCHG交换数据XCHG EAX, EBX交换 EAX 和 EB…...

使用 Streamlit 构建支持主流大模型与 Ollama 的轻量级统一平台
🎯 使用 Streamlit 构建支持主流大模型与 Ollama 的轻量级统一平台 📌 项目背景 随着大语言模型(LLM)的广泛应用,开发者常面临多个挑战: 各大模型(OpenAI、Claude、Gemini、Ollama)接口风格不统一;缺乏一个统一平台进行模型调用与测试;本地模型 Ollama 的集成与前…...

关键领域软件测试的突围之路:如何破解安全与效率的平衡难题
在数字化浪潮席卷全球的今天,软件系统已成为国家关键领域的核心战斗力。不同于普通商业软件,这些承载着国家安全使命的软件系统面临着前所未有的质量挑战——如何在确保绝对安全的前提下,实现高效测试与快速迭代?这一命题正考验着…...
Java 二维码
Java 二维码 **技术:**谷歌 ZXing 实现 首先添加依赖 <!-- 二维码依赖 --><dependency><groupId>com.google.zxing</groupId><artifactId>core</artifactId><version>3.5.1</version></dependency><de…...

推荐 github 项目:GeminiImageApp(图片生成方向,可以做一定的素材)
推荐 github 项目:GeminiImageApp(图片生成方向,可以做一定的素材) 这个项目能干嘛? 使用 gemini 2.0 的 api 和 google 其他的 api 来做衍生处理 简化和优化了文生图和图生图的行为(我的最主要) 并且有一些目标检测和切割(我用不到) 视频和 imagefx 因为没 a…...

Selenium常用函数介绍
目录 一,元素定位 1.1 cssSeector 1.2 xpath 二,操作测试对象 三,窗口 3.1 案例 3.2 窗口切换 3.3 窗口大小 3.4 屏幕截图 3.5 关闭窗口 四,弹窗 五,等待 六,导航 七,文件上传 …...

Ubuntu Cursor升级成v1.0
0. 当前版本低 使用当前 Cursor v0.50时 GitHub Copilot Chat 打不开,快捷键也不好用,当看到 Cursor 升级后,还是蛮高兴的 1. 下载 Cursor 下载地址:https://www.cursor.com/cn/downloads 点击下载 Linux (x64) ,…...

Linux部署私有文件管理系统MinIO
最近需要用到一个文件管理服务,但是又不想花钱,所以就想着自己搭建一个,刚好我们用的一个开源框架已经集成了MinIO,所以就选了这个 我这边对文件服务性能要求不是太高,单机版就可以 安装非常简单,几个命令就…...