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

因子分解(递归)

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.素分解式(简单版) 任务描述 编写函数&#xff0c;输出一个正整数的素数分解式。主函数的功能为输入若干正整数&#xff08;大于1&#xff09;&#xff0c;输出每一个数的素分解式。素数分解式是指将整数写成若干素数(从小到大)乘积的形式。例如&#xff1a; 202*2*5 362*2*…...

【Python】pandas库---数据分析

大学毕业那年&#xff0c;你成了社会底层群众里&#xff0c;受教育程度最高的一批人。 前言 这是我自己学习Python的第四篇博客总结。后期我会继续把Python学习笔记开源至博客上。 上一期笔记有关Python的NumPy数据分析&#xff0c;没看过的同学可以去看看&#xff1a;【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

最近天冷&#xff0c;打印机预热突然失败&#xff0c;热床无法加热&#xff0c;过了一段时间报错err6&#xff0c;查看另一篇资料说是天气冷原因&#xff0c;导致代码的PID控温部分达不到预期加热效果&#xff0c;从而自检报错&#xff0c;然后资料通过修改3D打印机代码的方式进…...

基于 MATLAB 的图像增强技术分享

一、引言 图像增强是数字图像处理中的重要环节&#xff0c;其目的在于改善图像的视觉效果&#xff0c;使图像更清晰、细节更丰富、对比度更高&#xff0c;以便于后续的分析、识别与理解等任务。MATLAB 作为一款功能强大的科学计算软件&#xff0c;提供了丰富的图像处理工具和函…...

前端知识补充—HTML

1. HTML 1.1 什么是HTML HTML(Hyper Text Markup Language), 超⽂本标记语⾔ 超⽂本: ⽐⽂本要强⼤. 通过链接和交互式⽅式来组织和呈现信息的⽂本形式. 不仅仅有⽂本, 还可能包含图⽚, ⾳频, 或者⾃已经审阅过它的学者所加的评注、补充或脚注等等 标记语⾔: 由标签构成的语⾔…...

安卓从Excel文件导入数据到SQLite数据库的实现

在现代的移动应用开发中&#xff0c;数据的处理和管理是至关重要的一环。有时候&#xff0c;我们需要从外部文件&#xff08;如Excel文件&#xff09;中导入数据&#xff0c;以便在应用程序中使用。本文将介绍如何在Android应用中使用Java代码从一个Excel文件中导入数据到SQLit…...

C/C++基础知识复习(44)

1) C 中多态性在实际项目中的应用场景 多态性是面向对象编程&#xff08;OOP&#xff09;中的一个重要特性&#xff0c;指的是不同的对象可以通过相同的接口来表现不同的行为。在 C 中&#xff0c;多态通常通过虚函数&#xff08;virtual&#xff09;和继承机制来实现。实际项…...

【day13】深入面向对象编程

【day12】回顾 在正文开始之前&#xff0c;先让我们回顾一下【day12】中的关键内容&#xff1a; 接口&#xff08;Interface&#xff09;&#xff1a; interface关键字用于定义接口。implements关键字用于实现接口。 接口成员&#xff1a; 抽象方法&#xff1a;需要在实现类中…...

《 火星人 》

题目描述 人类终于登上了火星的土地并且见到了神秘的火星人。人类和火星人都无法理解对方的语言&#xff0c;但是我们的科学家发明了一种用数字交流的方法。这种交流方法是这样的&#xff0c;首先&#xff0c;火星人把一个非常大的数字告诉人类科学家&#xff0c;科学家破解这…...

盒子模型(内边距的设置)

所有元素都可以设置内边距属性和外边距属性大体相同&#xff0c;可参考上一篇&#xff0c;但有区别 内边距不能设置为负值padding-方向&#xff1a;尺寸 注意&#xff1a;使用内边距padding之后元素整体会变大&#xff0c;因为他是直接加上了内边距的大小&#xff0c;不改变元素…...

CentOS7网络配置,解决不能联网、ping不通外网、主机的问题

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

如何测继电器是否正常

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

最优二叉搜索树【东北大学oj数据结构10-4】C++

题面 最优二叉搜索树是由 n 个键和 n1 个虚拟键构造的二叉搜索树&#xff0c;以最小化搜索操作的成本期望值。 给定一个序列 Kk1​,k2​,...,kn​&#xff0c;其中 n 个不同的键按排序顺序 &#xff0c;我们希望构造一个二叉搜索树。 对于每个关键 ki​&#xff0c;我们有一个…...

ESP32应用开发-Webserver

文章目录 库调用实例实现思路技术要点 1. 前端涉及的文件需要包装再发送2. http-GET路由3. http-POST路由 开发环境&#xff1a;Arduino 库调用 #include <WebServer.h> #include <ArduinoJson.h> //IDE没有自带&#xff0c;需自行安装实例 WebServer server…...

【IMU:视觉惯性SLAM系统】

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

前端开发 之 12个鼠标交互特效下【附完整源码】

前端开发 之 12个鼠标交互特效下【附完整源码】 文章目录 前端开发 之 12个鼠标交互特效下【附完整源码】七&#xff1a;粒子烟花绽放特效1.效果展示2.HTML完整代码 八&#xff1a;彩球释放特效1.效果展示2.HTML完整代码 九&#xff1a;雨滴掉落特效1.效果展示2.HTML完整代码 十…...

Unity文件路径访问总结:从基础到高级的资源加载方法

在Unity开发中&#xff0c;文件路径的访问和资源加载是开发者经常需要处理的任务。无论是加载纹理、模型、音频&#xff0c;还是读取配置文件&#xff0c;正确地处理路径和资源加载是确保项目顺利运行的关键。本文将以Unity文件路径访问为主线&#xff0c;详细介绍Unity中常见的…...

AWS Transfer 系列:简化文件传输与管理的云服务

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

Jenkins Api Token 访问问题

curl --location http://192.168.18.202:8080/view/ChinaFish/job/Ali/buildWithParameters?token1142be281174ee8fdf58773dedcef7ea4c&DeployTypeUpdateConfig \ --header Authorization: •••••• \ --header Cookie: JSESSIONID.824aa9a5node01ojk9yhh3imc24duwy67…...

垂起固定翼无人机大面积森林草原巡检技术详解

垂起固定翼无人机大面积森林草原巡检技术是一种高效、精准的监测手段&#xff0c;以下是对该技术的详细解析&#xff1a; 一、垂起固定翼无人机技术特点 垂起固定翼无人机结合了多旋翼和固定翼无人机的优点&#xff0c;具备垂直起降、飞行距离长、速度快、高度高等特点。这种无…...

【Leetcode 每日一题】1387. 将整数按权重排序

问题背景 我们将整数 x x x 的 权重 定义为按照下述规则将 x x x 变成 1 1 1 所需要的步数&#xff1a; 如果 x x x 是偶数&#xff0c;那么 x x / 2 x x / 2 xx/2。如果 x x x 是奇数&#xff0c;那么 x 3 x 1 x 3 \times x 1 x3x1。 比方说&#xff0c; x …...

科研笔记 KDD 2025

1 基本介绍 KDD 每年有多次投稿周期。KDD 2025 将有两个截止时间&#xff1a;分别是 2024 年 8 月 1 日和 2025 年 2 月 1 日&#xff08;全文提交截止时间在摘要提交截止后一周&#xff09;。 同时&#xff0c;KDD 会议论文集&#xff08;Proceedings&#xff09;将分两批出…...

黑马Java面试教程_P8_并发编程

系列博客目录 文章目录 系列博客目录前言1.线程的基础知识1.1 线程和进程的区别&#xff1f;难2频3面试文稿 1.2 并行和并发有什么区别&#xff1f; 难1频1面试文稿 1.3 创建线程的四种方式 难2频4面试文稿 1.4 runnable 和 callable 有什么区别 难2频3面试文稿 1.5 线程的 run…...

网络视频监控平台/安防监控/视频综合管理Liveweb视频汇聚平台解决方案

一、当前现状分析 当前视频资源面临以下问题&#xff1a; 1&#xff09;不同单位在视频平台建设中以所属领域为单位&#xff0c;设备品牌众多&#xff0c;存在的标准不一&#xff0c;各系统之间也没有统一标准&#xff1b; 2&#xff09;各单位视频平台建设分散、统筹性差&am…...

workman服务端开发模式-应用开发-后端api推送修改二

需要修改两个地方&#xff0c;第一个是总控制里面的续token延时&#xff0c;第二个是操作日志记录 一、总控续token延时方法 在根目录下app文件夹下controller文件夹下Base.php中修改isLoginAuth方法&#xff0c;具体代码如下&#xff1a; <?php /*** 总控制* User: 龙哥…...

SQL 使用带聚集函数的联结

聚集函数用于汇总数据&#xff0c;通常用于从一个表中计算统计信息&#xff0c;但也可以与联结一起使用。以下是一个例子&#xff0c;展示如何使用聚集函数统计每个顾客的订单数。 示例 1&#xff1a;使用 COUNT() 函数与 INNER JOIN 假设我们需要检索所有顾客及每个顾客所下…...

Restaurants WebAPI(三)——Serilog/FluenValidation

文章目录 项目地址一、Serilog使用1.1 安装 Serilog1.2 注册日志服务1.3 设置日志级别和详情1.4 配置到文件里1.5 给不同的环境配置日志1.5.1 配置appsettings.Development.json二、Swagger的使用三、自定义Exception中间件3.1 使用FluentValidation项目地址 教程作者:教程地址…...

概率论得学习和整理32: 用EXCEL描述正态分布,用δ求累计概率,以及已知概率求X的区间

目录 1 正态分布相关 2 正态分布的函数和曲线 2.1 正态分布的函数值&#xff0c;用norm.dist() 函数求 2.2 正态分布的pdf 和 cdf 2.3 正态分布的图形随着u 和 δ^2的变化 3 正态分布最重要的3δ原则 3.0 注意&#xff0c;这里说的概率一定是累计概率CDF&#xff0c;而…...