02 分解质因子

这篇具有很好参考价值的文章主要介绍了02 分解质因子。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

一、数n的质因子分解

题目描述:

输入一个数n(n<=10^6),将数n分解质因数,并按照质因数从小到大的顺序输出每个质因数的底数和指数。

输入 5 

输出 5 1

输入 10

输出 2 1 5 1

朴素解法:

首先求出1~n的所有质数,每个质数每个质数的进行去除,要保证n中除尽除完,直到把n除到1为止。

程序实现:

#include<bits/stdc++.h>

using namespace std;

const int N=1e6;

int prime[N],idx;
bool st[N];

void init(){
	for(int i=2;i<N;i++){
		if(!st[i]) prime[++idx]=i;
		for(int j=1;prime[j]*i<N;j++){
			st[prime[j]*i]=1;
			if(i%prime[j]==0) break;
		}
	}
}
int main(){
	init();
	int n;
	cin>>n;
	if(!st[n]) cout<<n<<" "<<1<<endl;
	else{
		for(int i=1;prime[i]<=n&&i<=idx;i++){
			int p=prime[i];
			int sum=0;
			while(n%p==0){
				sum++;
				n/=p;
			}
			if(sum) cout<<p<<" "<<sum<<endl;
		}
	}
	return 0;
}

优化思路:

其一:n如果除掉了前面的某个质因子,后面不能再被某个质因子的倍数整除了,证明比较简单,使用反证法就可以。

其二:n中最多只含有一个大于的因子。证明通过反证法:如果有两个大于sqrt(n)的因子,那么相乘会大于n,矛盾。证毕

基于上面的两条结论,只要从1~把每个数都除一遍,除尽除完,最后剩下的数如果不为1,这个数就是最大的质因子

代码实现

#include<bits/stdc++.h>
using namespace std;

int main(){
	int n;
	cin>>n;
	for(int i=2;i<=n/i;i++){
		int sum=0;
		while(n%i==0){
			sum++;
			n/=i;
		}
		if(sum) cout<<i<<" "<<sum<<endl;
	}
	if(n!=1) cout<<n<<" "<<1<<endl;
	return 0;
}

二、阶乘的质因子分解

题目描述

题目分析:

我们枚举1∼n的所有数,把每一个数的质因子加到一个数组里。
最后输出质因子数量大于0的数。 时间复杂度为O(n^2/ln n)

程序实现:

#include<bits/stdc++.h>
using namespace std;
const int N=1e6;
int prime[N],idx;
bool st[N];

void init(){
	for(int i=2;i<N;i++){
		if(!st[i]) prime[++idx]=i;
		for(int j=1;prime[j]*i<N;j++){
			st[prime[j]*i]=1;
			if(i%prime[j]==0) break;
		}
	}
}
int ans[N];  //ans[i]表示第i个质因子的个数
int main(){
	init();
	int n;
	cin>>n;
	for(int i=2;i<=n;i++){  //枚举每一个数
		for(int j=1;prime[j]<=i&&j<=idx;j++){
			int p=prime[j];
			int cur=i;
			while(cur%p==0){
				ans[j]++;
				cur/=p;
			}
		}
	}
	for(int i=1;i<=idx;i++){
		if(ans[i]) cout<<prime[i]<<" "<<ans[i]<<endl;
	}
	
	return 0;
}

优化思路:

我们不去枚举每个数,而是枚举每个质因子,看下在2~n中每个质因子出现的次数

在1x2x3x4x5x6x......x n-1 x n其中

能够被2整除的数有:

1*2 2*2 3*2....... i*2  其中2*i<=n        个数 i=n/2

能够被整除的数有:

1* 2* 3*......i* 其中i*<=n  个数i=n/

...........

在统计被2整除的个数时,相当于把每个数都除了2,剩下的数还有可能被2整除那些数是的数,的数有n/个,剩下的数还有可能被2整除,那些数是的数,的数有n/个,............所以2作为因子的个数为

02 分解质因子,03 算法竞赛—进阶指南,算法,c++,数据结构   其中

同理3作为因子的个数为:

02 分解质因子,03 算法竞赛—进阶指南,算法,c++,数据结构   其中

等等

所以只要枚举每个质数,使用循环在求出该质数作为因子的个数即可,每个质数求解时,

p=,质数的个数为,因此总的时间复杂度为*=*= ,即时间复杂度为O(n)文章来源地址https://www.toymoban.com/news/detail-823639.html

到了这里,关于02 分解质因子的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 《算法竞赛进阶指南》0x51 线性DP

    题意: N N N 个人站成左端对齐的 k k k 排,每排有 N i N_i N i ​ 人, N i N j N_i N_j N i ​ N j ​ 如果 i j i j i j ,则 N i N j N_i N_j N i ​ N j ​ 。每一排从左到右身高递减,每一列从后到前身高递减。询问方案数。 解析: 按照身高从大到小的顺序决定位置。在任意时刻,已经确定位

    2023年04月23日
    浏览(34)
  • JavaSE学习进阶day03_02 内部类

    2.1.1 什么是内部类 将一个类A定义在另一个类B里面,里面的那个类A就称为 内部类 ,B则称为 外部类 。可以把内部类理解成寄生,外部类理解成宿主。 2.1.2 什么时候使用内部类 一个事物内部还有一个独立的事物,内部的事物脱离外部的事物无法独立使用 人里面有一颗心脏。

    2023年04月15日
    浏览(22)
  • 1071: 分解质因子

    题目描述 将一个正整数分解质因数,例如,输入90,输出2 3 3 5。 输入 输入一个正整数n(2=n=2000)。 输出 从小到大输出n的所有质因子,每两个数之间空一格。 样例输入  样例输出  提示 注意,最后一个数后面没有空格!! 运行结果:

    2024年01月23日
    浏览(33)
  • C++ 算法竞赛、03 周赛篇 | AcWing 第4场周赛

    竞赛 - AcWing 3694. A还是B - AcWing题库 简单题 3695. 扩充序列 - AcWing题库 考查递归。可以发现最终序列除中点,左右两段都是相等的,可以依据这个特性来递归 超级长的序列缩小 (log_2n) 次,每次将 k 坐标映射到缩小的各个序列上,k肯定是其中一个序列的中点 3696. 构造有向无环

    2024年02月09日
    浏览(28)
  • 使用卷积操作实现因子分解机

    本文将介绍如何使用卷积操作实现因子分解机器。卷积网络因其局部性和权值共享的归纳偏差而在计算机视觉领域获得了广泛的成功和应用。卷积网络可以用来捕获形状的堆叠分类特征(B, num_cat, embedding_size)和形状的堆叠特征(B, num_features, embedding_size)之间的特征交互。 下图显

    2024年02月10日
    浏览(33)
  • C++ 算法竞赛、02 周赛篇 | AcWing 第2场周赛

    竞赛 - AcWing AcWing 3626. 三元一次方程 - AcWing 两层循环 3627. 最大差值 - AcWing题库 考查贪心,所有输入的不是0的数排序,每次操作取最大的数++,由于每个数最大可以是1e9,int可能溢出,需要用 long long 3628. 边的删减 - AcWing题库 刚开始有点傻,打算用克鲁斯卡尔生成最小生成树

    2024年02月10日
    浏览(27)
  • 整数因子分解问题(分治法&&欧拉线性筛素数)

    问题描述: 大于1 的正整数n 可以分解为:n=x1*x2*…*xm。 例如,当n=12 时,共有8 种不同的分解式: 12=12; 12=6*2; 12=4*3; 12=3*4; 12=3*2*2; 12=2*6; 12=2*3*2; 12=2*2*3 。 编程任务: 对于给定的正整数n,编程计算n 共有多少种不同的分解式。 数据输入: 由文件input.txt 给出输入数据

    2024年01月17日
    浏览(36)
  • 算法竞赛:初级算法(第一章:基础数据结构)

    动态链表 动态链表需要 临时分配链表节点 ,使用完毕后释放。 优点 :能及时释放空间,不使用多余内存 缺点 :需要管理空间,容易出错(竞赛一般不用动态链表) 静态链表 静态链表使用 预先分配的一段连续空间 存储链表,这种链表在逻辑上是成立的。 有两种做法:

    2024年01月19日
    浏览(34)
  • 数据结构和算法学习记录——平衡二叉树(基本介绍、平衡因子、平衡二叉树的定义、平衡二叉树的高度)

    目录 基本介绍 平衡因子 平衡二叉树  平衡二叉树的高度  什么是平衡二叉树? 以一个例子来解释一下: 搜索树结点按不同的插入次序,将会导致不同的深度和平均查找长度ASL   在二叉搜索树中查找一个元素:  (a)要找到Jan,需要查找一次;要找到Feb,需要查找两次;

    2023年04月26日
    浏览(49)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包