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

欧拉项目第三题之最大质数因子相关推荐

  1. 欧拉工程第三题 找出一个合数的最大质数因子

    题目: 13195的质数因子有5,7,13和29. 600851475143的最大质数因子是多少? 解题方法: 本次求解过程使用了一个比较聪明的做法,这也是经过仔细思考之后才想出来的,当然也是受到了某 ...

  2. [Project Euler] 来做欧拉项目练习题吧: 题目004

        [Project Euler] 来做欧拉项目练习题吧: 题目004 周银辉 问题描述: A palindromic number reads the same both ways. The l ...

  3. [Project Euler] 来做欧拉项目练习题吧: 题目012

      [Project Euler] 来做欧拉项目练习题吧: 题目012 周银辉 问题描述: The sequence of triangle numbers is generated by addin ...

  4. 中国纯电动车新车质量蔚来、特斯拉、欧拉列前三;长城汽车计划将P系列皮卡推向全球市场 | 美通企业日报...

    今日看点 中国纯电动车新车质量蔚来.特斯拉.欧拉列前三.J.D. Power发布中国新能源汽车体验研究.研究显示,随着新能源汽车市场发展步入快车道,新能源汽车品牌间的质量差距也在逐渐拉大,国际品牌新能 ...

  5. [Project Euler] 来做欧拉项目练习题吧: 题目017

    [Project Euler] 来做欧拉项目练习题吧: 题目017 周银辉 题目描述: If the numbers 1 to 5 are written out in words: one, two ...

  6. 欧拉工程第12题 第一个拥有超过500个约数的三角形数是多少

    题目 三角形数序列是由对自然数的连加构造而成的.所以第七个三角形数是1+2+3+4+5+6+7=281+2+3+4+5+6+7=28. 那么三角形数序列中的前十个是: 1,3,6,10,15,21,2 ...

  7. [Project Euler] 来做欧拉项目练习题吧: 题目013

    问题描述: Work out the first ten digits of the sum of the following one-hundred 50-digit numbers. 371072 ...

  8. 【欧拉计划第 5 题】最小公倍数 Smallest multiple

    Problem 5 Smallest multiple 2520 is the smallest number that can be divided by each of the numbers f ...

  9. 详解欧拉计划第395题:毕达哥拉斯树

    本题难度系数为40%(最易5%,最难100%). 毕达哥拉斯树是按如下步骤生成的分形图形: 从一个单位正方形开始,以其中一条边为基底(在图示中,单位正方形下放的边作为基底),给基底所对的边粘连上一个三 ...

最新文章

  1. c51矩形波输出汇编语言,51单片机汇编语言编程:用定时器控制输出矩形波
  2. DB2 乱码
  3. java字节码运行原理_JVM 内部原理(六)— Java 字节码基础之一
  4. linux查看启动配置文件内容,Linux开机启动项的查看和设置方法总结
  5. 从此走上一条iOS程序猿不归路。。。
  6. 制作简单的java应用程序_使用exe4j工具制作简单的java应用程序
  7. 理想汽车市值逼近蔚来,王兴曾多次在饭否为其站台
  8. webdriver原理(自己做个记录)
  9. 写给新入职的毕业生们(二)
  10. 银行核心系统概念入门简介
  11. cad转pdf怎么变成黑白?
  12. 软件License管理与代码保护技术概述
  13. 电脑播放视频显示运行服务器失败,电脑不能播放视频如何解决?
  14. 读Java 804 - Quick refresher
  15. 关于高电平与低电平的使用
  16. 怎么画因果图?因果图绘图步骤详解
  17. Tomcat优化方案
  18. hive案例:hive对房产数据进行过滤
  19. HM-SpringCloud微服务系列11.1.2【案例导入】
  20. Win7 64位安装VS2010旗舰版出现错误...Microsoft Visual Studio 2010 64bitPrerequisites (x64)

热门文章

  1. 编写第一个OpenACC程序
  2. 第十五天 图【下】(大结局)
  3. 一次难忘的 MTS 故障的排除过程
  4. volatile学习
  5. 安装eclipse版本oxygen,及maven导入spring mvc项目并运行
  6. Qt: error lnk1158 无法运行rc.exe
  7. CNI portmap插件实现源码分析
  8. tips:Java基本数据类型大小比较
  9. adb命令安装apk 来学习吧
  10. 数学公式(待慢慢总结)