【欧拉计划第 3 题】最大质因数 Largest prime factor
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)
求解质因数的方法中,比较常见的事短除法,它的具体求解步骤是
- N/2 (N为任意大于 2 的自然数),得到商
- 步骤一的商继续除以 2,直到商不能被 2 整除
- 被除数加一,比较平方数是否小于被除数(若小于,则所得商继续除以 3,不能整除,则除以 5)
- 分层循环,当除数的平方大于等于被除数时退出循环,此时 N 为最大质因数。一层判断除数的平方是否小于被除数,另一层判断被除数是否可以整除除数
代码实现
整体思路并没有问题,但是由于题目中给定数值已经超过了一般的执行范围,总是报错 stackoverflow,并未计算到最终结果,或许可以考虑用一台性能更好的机器测试下
该 C++ 版本代码编译速度很快,供参考
#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 printfDOUBLE 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
参考资料:
- Find the largest prime factor of a composite number
【欧拉计划第 3 题】最大质因数 Largest prime factor相关推荐
- 【欧拉计划第 5 题】最小公倍数 Smallest multiple
Problem 5 Smallest multiple 2520 is the smallest number that can be divided by each of the numbers f ...
- 【欧拉计划第 13 题】 大数之和 Large sum
Problem 13 Large sum Work out the first ten digits of the sum of the following one-hundred 505050-di ...
- 欧拉计划 第5题 Smallest multiple
问题 2520 is the smallest number that can be divided by each of the numbers from 1 to 10 without any r ...
- 详解欧拉计划第395题:毕达哥拉斯树
本题难度系数为40%(最易5%,最难100%). 毕达哥拉斯树是按如下步骤生成的分形图形: 从一个单位正方形开始,以其中一条边为基底(在图示中,单位正方形下放的边作为基底),给基底所对的边粘连上一个三 ...
- 欧拉计划(project euler)最详细中文题解
欧拉计划是一个在线解题网站,题目以各类数学问题为主,通常需要结合一定的数学与编程知识,写出适当的程序求解问题(详细介绍可以参见我的文章).相比于力扣等刷题网站,欧拉计划上的题目有着更丰富的知识背景,在 ...
- 欧拉计划:第53题 Combinatoric selections
欧拉计划:第53题 Combinatoric selections 无意中知道有这个用编程解决数学题的网站,个人对数学又比较感兴趣,所以打算做个欧拉计划系列,将自己的一些见解分享给大家,第一次写文章, ...
- 欧拉计划(鱼C论坛)@20161107
1.10以下的自然数中,属于3或5的倍数的数字有3,5,6,9,它们之和为23找出1000以下的自然数中,属于3或5倍数的所有数字之和. """ 欧拉计划 10以下的自然 ...
- 欧拉计划 P429 (数论)
欧拉计划 P429 Sum of squares of unitary divisors(数论) 传送门:https://projecteuler.net/problem=429 题目大意: 定义一个 ...
- 欧拉计划 Project Euler 50-56
Project Euler 50-56 Project Euler: https://projecteuler.net/ Project Euler | 欧拉计划: https://pe-cn.git ...
- python求直角三角形个数的公式_Python3 欧拉计划 问题71-75
EulerProject.png 问题66-70参见:https://www.jianshu.com/p/d0fad6213433 71.有序分数 考虑形如n/d的分数,其中n和d均为正整数.如果n ...
最新文章
- 百度 和 AI教父Hinton 的故事
- 【ASP.NET MVC 学习笔记】- 07 使用 Entity Framework
- jmeter之图片上传
- 1708硬盘转接口_ICY DOCK全球首款U.2转USB转接器震撼上市
- optional转化为set_JDK8新特性--学习笔记(OptionalCollectors)
- 大数据_Flink_数据处理_资源的分配和并行度测试---Flink工作笔记0013
- CSS:display和visibility隐藏的区别
- red hat linux 7.1 使用手册!,linux入门教材(Red Hat Linux 7.1)
- Python图像处理丨认识图像锐化和边缘提取的4个算子
- 【愚公系列】2022年10月 微信小程序-电商项目-商品详情页面说明和商品导航
- IP地址最后一位斜杠是什么意思?比如192.168.1.10/27?还有IP地址和子网掩码相加得到的网络地址是什么意思
- systemverilog:always_comb、always_latch、always_ff区别
- Java中Files工具类的使用
- oracle11g ora12170,11g告警日志中大量ORA-12170错误
- ps大图缩小让小图更清晰
- 1514_人月神话阅读笔记_20年后的人月神话_上篇
- springboot调整请求头大小_SpringBoot http post请求数据大小设置操作
- 基于安卓的 gps定位系统的跑步健身助手
- 谷粒商城--后端笔记(混乱)
- 求用户最大连续登陆天数mysql实现