当前位置: 首页 > 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 系列。这些…...

【Linux】shell脚本忽略错误继续执行

在 shell 脚本中&#xff0c;可以使用 set -e 命令来设置脚本在遇到错误时退出执行。如果你希望脚本忽略错误并继续执行&#xff0c;可以在脚本开头添加 set e 命令来取消该设置。 举例1 #!/bin/bash# 取消 set -e 的设置 set e# 执行命令&#xff0c;并忽略错误 rm somefile…...

Qwen3-Embedding-0.6B深度解析:多语言语义检索的轻量级利器

第一章 引言&#xff1a;语义表示的新时代挑战与Qwen3的破局之路 1.1 文本嵌入的核心价值与技术演进 在人工智能领域&#xff0c;文本嵌入技术如同连接自然语言与机器理解的“神经突触”——它将人类语言转化为计算机可计算的语义向量&#xff0c;支撑着搜索引擎、推荐系统、…...

css的定位(position)详解:相对定位 绝对定位 固定定位

在 CSS 中&#xff0c;元素的定位通过 position 属性控制&#xff0c;共有 5 种定位模式&#xff1a;static&#xff08;静态定位&#xff09;、relative&#xff08;相对定位&#xff09;、absolute&#xff08;绝对定位&#xff09;、fixed&#xff08;固定定位&#xff09;和…...

PL0语法,分析器实现!

简介 PL/0 是一种简单的编程语言,通常用于教学编译原理。它的语法结构清晰,功能包括常量定义、变量声明、过程(子程序)定义以及基本的控制结构(如条件语句和循环语句)。 PL/0 语法规范 PL/0 是一种教学用的小型编程语言,由 Niklaus Wirth 设计,用于展示编译原理的核…...

C++ 求圆面积的程序(Program to find area of a circle)

给定半径r&#xff0c;求圆的面积。圆的面积应精确到小数点后5位。 例子&#xff1a; 输入&#xff1a;r 5 输出&#xff1a;78.53982 解释&#xff1a;由于面积 PI * r * r 3.14159265358979323846 * 5 * 5 78.53982&#xff0c;因为我们只保留小数点后 5 位数字。 输…...

【开发技术】.Net使用FFmpeg视频特定帧上绘制内容

目录 一、目的 二、解决方案 2.1 什么是FFmpeg 2.2 FFmpeg主要功能 2.3 使用Xabe.FFmpeg调用FFmpeg功能 2.4 使用 FFmpeg 的 drawbox 滤镜来绘制 ROI 三、总结 一、目的 当前市场上有很多目标检测智能识别的相关算法&#xff0c;当前调用一个医疗行业的AI识别算法后返回…...

关键领域软件测试的突围之路:如何破解安全与效率的平衡难题

在数字化浪潮席卷全球的今天&#xff0c;软件系统已成为国家关键领域的核心战斗力。不同于普通商业软件&#xff0c;这些承载着国家安全使命的软件系统面临着前所未有的质量挑战——如何在确保绝对安全的前提下&#xff0c;实现高效测试与快速迭代&#xff1f;这一命题正考验着…...

SiFli 52把Imagie图片,Font字体资源放在指定位置,编译成指定img.bin和font.bin的问题

分区配置 (ptab.json) img 属性介绍&#xff1a; img 属性指定分区存放的 image 名称&#xff0c;指定的 image 名称必须是当前工程生成的 binary 。 如果 binary 有多个文件&#xff0c;则以 proj_name:binary_name 格式指定文件名&#xff0c; proj_name 为工程 名&…...

mac 安装homebrew (nvm 及git)

mac 安装nvm 及git 万恶之源 mac 安装这些东西离不开Xcode。及homebrew 一、先说安装git步骤 通用&#xff1a; 方法一&#xff1a;使用 Homebrew 安装 Git&#xff08;推荐&#xff09; 步骤如下&#xff1a;打开终端&#xff08;Terminal.app&#xff09; 1.安装 Homebrew…...

C++ 设计模式 《小明的奶茶加料风波》

&#x1f468;‍&#x1f393; 模式名称&#xff1a;装饰器模式&#xff08;Decorator Pattern&#xff09; &#x1f466; 小明最近上线了校园奶茶配送功能&#xff0c;业务火爆&#xff0c;大家都在加料&#xff1a; 有的同学要加波霸 &#x1f7e4;&#xff0c;有的要加椰果…...