质因数分解 深藏阁楼爱情的钟 2023-03-14 05:54 153阅读 0赞 一道清华的复试题,我先后看了两份代码,收获匪浅,分别摘自下面两个博客: [https://blog.csdn.net/Little\_Kid\_Kang/article/details/88031973][https_blog.csdn.net_Little_Kid_Kang_article_details_88031973] [https://blog.csdn.net/Zero\_979/article/details/105039355][https_blog.csdn.net_Zero_979_article_details_105039355] 第一个博客我可以看懂,意思很明白,第二个博客涉及到知识盲区了,原来还可以这么简单的做出来: ## 第一份博客的代码: ## #include <iostream> #include <cmath> using namespace std; /*判断是否为质数*/ bool prime(int N) { if (N < 2) return false; if (N == 2) return true; int i; for (i = 2; i < sqrt(N); i++) { if (N%i == 0) //i能被j整除,N不是质数 { return false; } } return true; } /*寻找质因数的个数*/ int factor_num(int N) { int i = 2; int num = 0; while (i < sqrt(N)) { if (prime(N))//N为质数,循环退出 { num++; break; } if (N%i != 0 || !prime(i))//i不是N的因数 || i不是质数 { i++; continue; } if (prime(i))//i是N的一个质因数 { num++; N = N / i; i = 2; } } return num; } int main() { int N; int i; while (cin >> N) cout << factor_num(N) << endl; return 0; } 比较简单,就是先判断此时的N是不是质因数,是的话代表已经数完了,为什么呢,为什么能保证此时N为质数就一定是最后一个因数呢,也就是说比如有n个质因数,不存在我数到中间的时候,后面因数的乘积是一个质数喽?中间的每次N=N/i,N都是一个非质数嘛? 有两种思路: 1.此时N是质数,不可能再分了,所以停止计算。 2.是的,因为我们数质数的过程是从小的质数开始的,比如120=2\*2\*2\*3\*5,我们会把所有的小质数2都数完再继续往下进行,所以在中间过程中如果N是个非质数,代表还有其他的质数没有被找到,且>=当前的i,所以继续进行,一旦N此时是质数了,表示这就是所能达到的最大的质因数了,不存在更大的质数了,所以输出。 第二步如果不是N的因数或者不是质数,就舍弃,继续往下走。 第三步,i是质数,那么N=N/i,i再从头开始找。 这份代码比较容易理解,那也是因为我之前不知道下面的东西,所以觉得挺好的了。 ## 第二种方法: ## # [Pollard Rho][]因数分解 # #include<iostream> #include<stack> #include<cmath> using namespace std; int main() { long long int a; while(cin>>a) { stack<int> s; for(int i=2;i<=sqrt(a);i++) { if(a%i==0) { s.push(i); a=a/i; i--; } } cout<<s.size()+1<<endl; } return 0; } 当时看了这份代码是蒙圈的,完全不知道为啥,现在看看其实也能理解了。其实一切的一切都是因为是从小到大遍历i的,即便N有很多合数因数,也已经被拆分成更小的质数了,所以上面s.push(i)中的每一个i都是一个质数!很神奇。 [https_blog.csdn.net_Little_Kid_Kang_article_details_88031973]: https://blog.csdn.net/Little_Kid_Kang/article/details/88031973 [https_blog.csdn.net_Zero_979_article_details_105039355]: https://blog.csdn.net/Zero_979/article/details/105039355 [Pollard Rho]: https://www.cnblogs.com/G-M-WuJieMatrix/p/7449974.html
相关 分解质因数 原理: ![13dda8e0e0e5492ea0a2a4912d8f48d8.png][] 做法: 按照枚举约数的做法去枚举质因子,在枚举到质因子的倍数之前先枚举到质因子 àì夳堔傛蜴生んèń/ 2024年03月30日 09:12/ 0 赞/ 45 阅读
相关 质因数分解 一道清华的复试题,我先后看了两份代码,收获匪浅,分别摘自下面两个博客: [https://blog.csdn.net/Little\_Kid\_Kang/article/de 深藏阁楼爱情的钟/ 2023年03月14日 05:54/ 0 赞/ 154 阅读
相关 分解质因数 上一篇博客:[质数的筛法][Link 1] > 写在前面:大家好!我是`AC-fun`,我的昵称来自两个单词`Accepted`和`fun`。我是一个热爱ACM的蒟蒻。如果 Love The Way You Lie/ 2022年10月22日 04:12/ 0 赞/ 226 阅读
相关 分解质因数 public class DecomposePrimeFactor \{ public final static int NUM = 154; public static vo Dear 丶/ 2022年09月30日 06:22/ 0 赞/ 216 阅读
相关 分解质因数 问题描述 求出区间\[a,b\]中所有整数的质因数分解。 输入格式 输入两个整数a,b。 输出格式 每行输出一个数的分解,形如k=a1\a2\a3...( 超、凢脫俗/ 2022年08月05日 02:54/ 0 赞/ 250 阅读
相关 分解质因数 题目内容: 每个非素数(合数)都可以写成几个素数(也可称为质数)相乘的形式,这几个素数就都叫做这个合数的质因数。比如,6可以被分解为2x3,而24可以被分解为2x2x2x3。 灰太狼/ 2022年07月03日 18:20/ 0 赞/ 248 阅读
相关 分解质因数 分解质因数 当无法分解是输出“no answer” <table style="font-size:12px; color:rgb(51,51,51); line-heig 淩亂°似流年/ 2022年06月06日 11:42/ 0 赞/ 277 阅读
相关 分解质因数 问题描述 求出区间\[a,b\]中所有整数的质因数分解。 输入格式 输入两个整数a,b。 输出格式 每行输出一个数的分解,形如k=a1\a2\a3...( 电玩女神/ 2022年06月01日 13:52/ 0 赞/ 285 阅读
相关 分解质因数 void solution(int num) { int i = 2; while (num != 1) { i ╰半夏微凉°/ 2022年05月09日 01:46/ 0 赞/ 315 阅读
还没有评论,来说两句吧...