博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
质因子分解
阅读量:6939 次
发布时间:2019-06-27

本文共 901 字,大约阅读时间需要 3 分钟。

质因子分解的问题就是给定一个n使得n能够分解为多个因子的乘积形式,并且相同因子用指数形式表示;

例如180=2^23^25;

对于这个问题,很好理解,我们的目的就是寻找其因子,通常的方法也就是从0开始枚举,然后通过取模或者整除操作来看是否是我们需要的元素;

具体的思路如下所示:

我们首先建立一个结构体:

struct factor{    int  x;    int cnt;}fac[10];

这里为每一个符合条件的因子创立一个结构体,fac数组是当前该数字所有因子存储数组;

结构体内x代表当前的因子,cnt代表当前因子出现的个数;
这里开10的目的是如果开更大会导致int溢出,并没有什么必要;

接下来就是计算部分;

我们对1~sqrt(n)挨个进行枚举;这里借鉴了寻找判定素数的概念,因为如果k存在,为n的质因子,对于n/k*n来说,其也是n的质因子,我们的目的是寻找最小质因子,所以只需要枚举到sqrt(n)就可以;

接下来要注意理解一个质因子分布的问题;

对于我们枚举到sqrt(n),必然会出现两种情况:
1.所有质因子都在sqrt(n)的枚举范围内;
2.有一个质因子大于sqrt(n),但其余的说有质因子都在sqrt(n)范围内,并且该较大的质因子必为素数;

我们该怎么理解这个问题,第一条很好理解,显然成立,那么第二条必然成立吗?

会不会有两个数字斗大于sqrt(n),并且这两个既可能是合数有可能是素数?

首先,不可能有两个质因子大于sqr(n),这样会导致乘积大于n,所以不符合初始条件;

那么剩下的质因子一定为素数嘛?
如果这个质因子是合数,则说明可以分解,必定可以分为多个较小质因子的乘积,或者多个数和一个素数的乘积;
所以无论那种情况,都是两种情况中的一个;

所以接下来我们通过枚举,对一个质因子猛除,记录他的出现次数,如果有余数,进行下一个数字的枚举猛除;直到到达sqrt(n)边界,如果还是有余数,则说明有第二个条件发生,有个较大的质因子,所以直接记录,因为这个质因子只可能出现一次,如果多次会使得乘积大于n;

大致的判断逻辑如下所示:

for(int i=0;i

转载地址:http://izsnl.baihongyu.com/

你可能感兴趣的文章
easyui-笔记
查看>>
php include 绝对路径 dirname(__FILE__)
查看>>
软考倒计时19天:招投标法、合同法、采购法
查看>>
通过style控制圆形imageView显示
查看>>
K - 4 Values whose Sum is 0(中途相遇法)
查看>>
实验五 Servlet过滤器
查看>>
GIT版本控制系统(二)
查看>>
关于一些测绘软件的评价
查看>>
UISearchBar--改变内部输入框的背景颜色
查看>>
使用redis-cli --pipe快速插入数据
查看>>
数据结构----队列:顺序队列&顺序循环队列、链式队列、顺序优先队列
查看>>
福大软工1816 · 第三次作业 - 结对项目1(原型设计)
查看>>
三国杀的10个人生感悟
查看>>
nginx错误:unknown directive "锘? in F:\nginx/conf/nginx.conf:3
查看>>
【数据结构-文都】第二章 线性表(1)
查看>>
Ubuntu快捷键
查看>>
mycp
查看>>
python连续爬取多个网页的图片分别保存到不同的文件夹
查看>>
linux之SQL语句简明教程---UNION ALL
查看>>
iphone-common-codes-ccteam源代码 CCAudio.mm
查看>>