欧拉项目第三题之最大质数因子
13195的质数因子有5,7,13和29.
600851475143的最大质数因子是多少?
这里可以肯定的是:1.数字很大,绝对不能暴力。2.如果这是一到OJ题,那么我们的目的就是尽量缩小这个数,减少计算量。
我们都知道,任何一个合数都是可以由他的所有质因素相乘得到的,比如15=3*3*3*3*3,12=2*2*3,60=2*2*3*5.(这些数都是我随便想的),好的,我们先看一个比较小的数60,现在我们要找它的最大质因子,我们可以从最小的奇数开始枚举(当然要先枚举2这个特殊的质数,除此之外的偶数可能是质数吗?),如果可以整除说明这个奇数是其因子之一,然后判断这个奇数如果是质数,那么它就是其中一个质因子。然后原数就可以除这个因子了,为了排除已经找到的因子,我们一直将它除这个数,直到不能整除,60/=2得30,30/=2得15,到此结束此因子,我们就找到了2这个质因子;同理,到3的时候15/=3得5,找到了3这个质因子;5/5=1,可以结束,5就是我们要找的最大质因子啦。如果是多测试的话一直频繁判断素数是不是有点不爽?所以我们可以打个素数表- -。还有一个优化就是这个素数不会超过sqrt(n),可以减少循环次数,至于证明自己搜吧。
附上我的AC代码:
#include<stdio.h> #include<map> #include<math.h> using namespace std; #define ll long long #define MAX 600851475143 map<ll,bool> is; map<ll,ll> pr; void init() {ll t=(ll)sqrt(10000000),i,j,p=0;for(i=2 ; i<= t ;i++)is[i]=true;for(int i=2 ; i<=t ; i++){if(is[i]==true){pr[p]=i;p++;for(j=2*i ; j<=t ; j+=i)is[j]=false;}} } ll sove() {ll m=(ll)sqrt(MAX);ll num=MAX;ll ans,la,i,f;if((num&1)==0){la=2;num>>=1;while((num&1)==0)num>>=1;}elsela=1;f=3;for(i=1 ; num>1 &&f<m;i++){f = pr[i];if(num%f==0){num/=f;la=f;while(num%f==0)num/=f;m=(ll)sqrt(num);}}if(num==1)return la;elsereturn num; } int main() {init();printf("%lld\n",sove()); }
View Code
谨防出错附上大神AC代码:
#include<bits/stdc++.h>using namespace std;typedef long long ll; typedef unsigned long long ull;const int MAXN = 100000000; int prime[MAXN],cnt_prime=0; bool isprime[MAXN];void GetPrime(int MAX) {memset(isprime,0,sizeof(isprime));int m=(int)sqrt((double)MAX);for(int i=2;i<=m;i++){if(!isprime[i]){for(int j=i*i;j<=MAX;j+=i){isprime[j]=1;}}}cnt_prime=0;for(int i=2;i<=MAX;i++){if(!isprime[i]){prime[cnt_prime++]=i;}} }int findit(ull num) {ull m = (int)sqrt(double(num));ull lastf,f;if((num&1)==0){lastf = 2;num>>=1;while((num&1)==0)num>>=1;}elselastf = 1;f=3;for(int i = 2; num > 1 && f < m; i++){f = prime[i];if(num % f == 0){num /= f;lastf = f;while(num%f==0)num/=f;m=(int)sqrt(double(num));}}if(num==1)return lastf;elsereturn num; }int main() {GetPrime(10000000);cout<<findit(600851475143)<<endl;}
View Code
转载于:https://www.cnblogs.com/shuaihui520/p/9016820.html
欧拉项目第三题之最大质数因子相关推荐
- 欧拉工程第三题 找出一个合数的最大质数因子
题目: 13195的质数因子有5,7,13和29. 600851475143的最大质数因子是多少? 解题方法: 本次求解过程使用了一个比较聪明的做法,这也是经过仔细思考之后才想出来的,当然也是受到了某 ...
- [Project Euler] 来做欧拉项目练习题吧: 题目004
[Project Euler] 来做欧拉项目练习题吧: 题目004 周银辉 问题描述: A palindromic number reads the same both ways. The l ...
- [Project Euler] 来做欧拉项目练习题吧: 题目012
[Project Euler] 来做欧拉项目练习题吧: 题目012 周银辉 问题描述: The sequence of triangle numbers is generated by addin ...
- 中国纯电动车新车质量蔚来、特斯拉、欧拉列前三;长城汽车计划将P系列皮卡推向全球市场 | 美通企业日报...
今日看点 中国纯电动车新车质量蔚来.特斯拉.欧拉列前三.J.D. Power发布中国新能源汽车体验研究.研究显示,随着新能源汽车市场发展步入快车道,新能源汽车品牌间的质量差距也在逐渐拉大,国际品牌新能 ...
- [Project Euler] 来做欧拉项目练习题吧: 题目017
[Project Euler] 来做欧拉项目练习题吧: 题目017 周银辉 题目描述: If the numbers 1 to 5 are written out in words: one, two ...
- 欧拉工程第12题 第一个拥有超过500个约数的三角形数是多少
题目 三角形数序列是由对自然数的连加构造而成的.所以第七个三角形数是1+2+3+4+5+6+7=281+2+3+4+5+6+7=28. 那么三角形数序列中的前十个是: 1,3,6,10,15,21,2 ...
- [Project Euler] 来做欧拉项目练习题吧: 题目013
问题描述: Work out the first ten digits of the sum of the following one-hundred 50-digit numbers. 371072 ...
- 【欧拉计划第 5 题】最小公倍数 Smallest multiple
Problem 5 Smallest multiple 2520 is the smallest number that can be divided by each of the numbers f ...
- 详解欧拉计划第395题:毕达哥拉斯树
本题难度系数为40%(最易5%,最难100%). 毕达哥拉斯树是按如下步骤生成的分形图形: 从一个单位正方形开始,以其中一条边为基底(在图示中,单位正方形下放的边作为基底),给基底所对的边粘连上一个三 ...
最新文章
- c51矩形波输出汇编语言,51单片机汇编语言编程:用定时器控制输出矩形波
- DB2 乱码
- java字节码运行原理_JVM 内部原理(六)— Java 字节码基础之一
- linux查看启动配置文件内容,Linux开机启动项的查看和设置方法总结
- 从此走上一条iOS程序猿不归路。。。
- 制作简单的java应用程序_使用exe4j工具制作简单的java应用程序
- 理想汽车市值逼近蔚来,王兴曾多次在饭否为其站台
- webdriver原理(自己做个记录)
- 写给新入职的毕业生们(二)
- 银行核心系统概念入门简介
- cad转pdf怎么变成黑白?
- 软件License管理与代码保护技术概述
- 电脑播放视频显示运行服务器失败,电脑不能播放视频如何解决?
- 读Java 804 - Quick refresher
- 关于高电平与低电平的使用
- 怎么画因果图?因果图绘图步骤详解
- Tomcat优化方案
- hive案例:hive对房产数据进行过滤
- HM-SpringCloud微服务系列11.1.2【案例导入】
- Win7 64位安装VS2010旗舰版出现错误...Microsoft Visual Studio 2010 64bitPrerequisites (x64)