首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >【欧拉计划第 3 题】最大质因数 Largest prime factor

【欧拉计划第 3 题】最大质因数 Largest prime factor

作者头像
攻城狮杰森
发布于 2022-06-03 05:10:11
发布于 2022-06-03 05:10:11
54900
代码可运行
举报
文章被收录于专栏:技术集锦技术集锦
运行总次数:0
代码可运行

Problem 3 Largest prime factor

The prime factors of 13195 are 5, 7, 13 and 29. What is the largest prime factor of the number 600851475143 ?

问题 3 最大质因数

13195 的质因数是 5、7、13 和 29。 数字 600851475143 的最大质因数是多少?

思路分析

首先要理解清楚质因数的概念

质因数,在数论中是指能整除给定正整数的质数。除了1以外,两个没有其他共同质因子的正整数称为互质。因为1没有质因子,1与任何正整数(包括1本身)都是互质 正整数的因数分解可将正整数表示为一连串的质因子相乘,质因子如重复可以用指数表示。根据算术基本定理,任何正整数皆有独一无二的质因子分解式。只有一个质因子的正整数为质数 如果一个质数是某个数的因数,那么就说这个质数是这个数的质因数,并且这个因数一定是一个质数

每个合数都可以写成几个质数相乘的形式,这几个质数均称为该合数的质因数

例如:6 的质因子是 2 和 3(6 = 2 × 3);10 的质因子是 2 和 5(10 = 2 × 5)

求解质因数的方法中,比较常见的事短除法,它的具体求解步骤是

  1. N/2 (N为任意大于 2 的自然数),得到商
  2. 步骤一的商继续除以 2,直到商不能被 2 整除
  3. 被除数加一,比较平方数是否小于被除数(若小于,则所得商继续除以 3,不能整除,则除以 5)
  4. 分层循环,当除数的平方大于等于被除数时退出循环,此时 N 为最大质因数。一层判断除数的平方是否小于被除数,另一层判断被除数是否可以整除除数

代码实现

整体思路并没有问题,但是由于题目中给定数值已经超过了一般的执行范围,总是报错 stackoverflow,并未计算到最终结果,或许可以考虑用一台性能更好的机器测试下

该 C++ 版本代码编译速度很快,供参考

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
#include <stdio.h>
#include <math.h>
#include <limits>
 
using namespace std;
 
typedef int		INT;
typedef	char	CHAR;
typedef void	VOID;
typedef double	DOUBLE;
 
#define PRINT	printf
#define DPRINT	printf
 
DOUBLE MaxPrimeFactor(DOUBLE n)
{
	DOUBLE i;
	DOUBLE tem;
	DOUBLE max;
 
	if(n - 1.99999999999999 < numeric_limits<DOUBLE>::epsilon())
		return -1.0;
 
	max = n;
 
	tem = n / 2.0;
	while(fabs(tem - (floor(tem))) < numeric_limits<DOUBLE>::epsilon())
	{
		DPRINT("prime factor is:%lf\n", 2.0);
		
		n = tem;
		tem = n / 2.0;
	}
	if(fabs(n-1.0) < numeric_limits<DOUBLE>::epsilon())
		return 2.0;
 
	for(i=3.0; i<=max; i+=2.0)
	{
		if(fabs(n-i) < numeric_limits<DOUBLE>::epsilon())
		{
			DPRINT("prime factor is:%lf\n", i);
			return i;
		}
 
		tem = n / i;
		while(fabs(tem - (floor(tem)) < numeric_limits<DOUBLE>::epsilon()))
		{
			DPRINT("prime factor is:%lf\n", i);
			
			n = tem;
			tem = n / i;
		}
		if(fabs(n-1.0) < numeric_limits<DOUBLE>::epsilon())
			return i;
	}
 
	return -1.0;
}
 
INT main(INT argc, CHAR *argv[])
{
	while(1)
	{
		PRINT("input num:\n");
 
		DOUBLE n;
		scanf("%lf", &n);
 
		if(n < 0)
			break;
 
		DOUBLE res = MaxPrimeFactor(n);
		PRINT("The largest prime factor is:%lf\n", res);
	}
	
	return 0;
}

答案:6857

参考资料:

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2022-04-17,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
Python3 初学实践案例(11)判断质数以及计算一个数字的质因数
判断是否为质数,我之前用 js 写过,详情参见:http://blog.csdn.net/FungLeo/article/details/51483844
FungLeo
2022/05/05
5280
Python3 初学实践案例(11)判断质数以及计算一个数字的质因数
浅谈欧拉函数[通俗易懂]
欧拉函数听起来很高大上,但其实非常简单,也是NOIP里的一个基础知识,希望大家看完我的博客能有所理解。 数论是数学的一个分支,它只讨论正整数的性质,所以以下都是针对正整数进行研究的。
全栈程序员站长
2022/09/23
1.4K0
分解质因数
分解质因数是将一个正整数分解为若干个质数的乘积的过程。每个质数都是一个素数,即只能被1和自身整除的数。
孟斯特
2024/04/11
2730
分解质因数
蓝桥杯-质因数个数
  判断一个数字是否是质数,就是看它的因子是否只有1和它本身。质数的判断我们简单写个函数判断就行,代码如下,遍历的时候不需要从2到n,只需要遍历到n的平方根即可。
别团等shy哥发育
2023/03/09
7130
蓝桥杯-质因数个数
Python3 判断质数以及计算一个数字的质因数
计算质数的关键是要减少运算量。如果傻呢,就从1循环到这个数字来进行全量循环计算。聪明一点就不需要了,只需要循环到这个数字的平方根的数字即可。
FungLeo
2019/05/27
2.7K0
算法(简单)_搜索二维矩阵&分解质因数
双循环找出是否有这个值,根据第二个特性,我们可以跳过一些第二层循环,算法更具效率。
OBKoro1
2020/10/27
3970
【C素数】素数(质数)和分解质因数
种一棵树最好的时间是十年前,其次是现在 文章目录 判断一个数是否是素数 1-1.基本概念: 1-2.题目描述: 1-3.题解思路: 1-4代码实现 1-4-1方法一:直接flag标记法: 1-4-2方法二:函数法: 2-1基本概念 2-2分解质因数和最大质因数 2-3题目描述 2-4解题思路 2-5代码实现 2-5-1方法:函数递归法: 判断一个数是否是素数 博主今天在复习C语言的时候遇到质因数,发现这个知识点忘记了,故有了此篇 先来复习一下概念吧: 一.素数 1-1.基
MicroFrank
2023/01/16
1K0
4. 基础数学初识
输出格式 共 n 行,其中第 i 行输出第 i 个正整数 ai 是否为质数,是则输出 Yes,否则输出 No。
浪漫主义狗
2022/09/14
1K0
4. 基础数学初识
数论——欧拉函数
根据前面的欧拉线性筛质数的算法(可参考本人博客:数论——质数筛法),由于它在筛选的同时也求出了每个数的最小质因子,故而在其基础上求出欧拉函数即可。
全栈程序员站长
2022/09/06
4030
数论——欧拉函数
质数筛与欧拉函数
我们提前设置一个标记数组prime[N] ,提前标记好数字的质数状态,这样就能减少重复判断。
fishhh
2022/08/30
7400
质数筛与欧拉函数
每日一题C++版(分解质因数)
编程是很多偏计算机、人工智能领域必须掌握的一项技能,此编程能力在学习和工作中起着重要的作用。因此小白决定开辟一个新的板块“每日一题”,通过每天一道编程题目来强化和锻炼自己的编程能力(最起码不会忘记编程)
小白学视觉
2019/10/24
1.5K0
欧拉函数及其相关性质的证明
数中,其中既是p1的倍数,又是p2的倍数的数有N/(p1⋅p2)个。根据容斥原理,NNN中去掉p1​和p2的倍数:
fishhh
2022/08/31
4950
欧拉函数及其相关性质的证明
欧拉函数、欧拉定理学习笔记
\varphi(n) = \sum \limits _{i=1}^n \left[ i \nmid n \right]
Clouder0
2022/09/23
1K0
C++初等数论
数学知识的根基对学好编程至关重要。本文和大家讲讲在编程中要用到的数论知识。如同余式、欧拉定理和欧拉函数、费马小定理、威尔逊定理、裴蜀定理、模运算意义下的逆元、扩展欧几里得算法、孙子定理(中国剩余定理)。
一枚大果壳
2024/03/11
3980
C++初等数论
10206. 「一本通 6.3 练习 1」X-factor Chain
输入正整数 x,求 x 的大于 1 的因子组成的满足任意前一项都能整除后一项的序列的最大长度,以及满足最大长度的序列的个数。
yzxoi
2022/09/19
3590
三种素数筛的比较
在自然数集中,质数的数量不多而且分布比较稀疏,对于一个整数N,不超过N的质数大概有N/lnN个,即每lnN个数中可能会有一个质数。
ACM算法日常
2018/12/13
1.4K0
C++经典算法题-将一个正整数分解质因数。例如:输入90,打印出90=2*3*3*5。
1. 题目 题目:将一个正整数分解质因数。例如:输入90,打印出90=233*5。 2. 分析 程序分析:对n进行分解质因数,应先找到一个最小的质数k,然后按下述步骤完成: 如果这个质数恰等于n,则说明分解质因数的过程已经结束,打印出即可。 如果n<>k,但n能被k整除,则应打印出k的值,并用n除以k的商,作为新的正整数你n,重复执行第一步。 如果n不能被k整除,则用k+1作为k的值,重复执行第一步。 3. 代码示例 main() { int n,i; pri
cwl_java
2020/01/14
3.1K0
六十六、丑数系列,丑的颠覆我的思想
取一粒跳跃的文字,镶进九月的诗篇,无论是水榭的一角,还是月下的花园,只要有岁月的空格,就能拼接出精美的图案。
润森
2022/08/17
3010
六十六、丑数系列,丑的颠覆我的思想
Python|欧拉筛法求质数
我们知道第一个质数是 2、第二个质数是 3、第三个质数是 5……请你计算第 2020 个质数是多少?
算法与编程之美
2020/09/24
1.8K0
算法比赛——必备的数论知识
算术基本定理,又称为正整数的唯一分解定理,即:每个大于1的自然数,要么本身就是质数,要么可以写为2个或以上的质数的积,而且这些质因子按大小排列之后,写法仅有一种方式。
秋名山码神
2023/02/26
4580
算法比赛——必备的数论知识
相关推荐
Python3 初学实践案例(11)判断质数以及计算一个数字的质因数
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档