Project Euler-003-最大质因数
因数:AxB=C,则称A,B为C的因数。
质(素)数:一个除了能被1和他自身外,不能被其他自然数整除的自然数。
合数:与质数相对,除了1和他自身之外,还能被其他自然数整除的自然数。
思路:我们可以任何一个数都看成一系列素数相乘的形式,即A=p1a1 x p2a2 x p3a3 x …,例如12 = 21 x 6 1 = 22 x 31。所以我们发现,任何一个数都能被表示成这种形式(为什么可以表示成这种形式?其实这正是质数的排列组合,详情请移步知乎搜索。),那么他的最大质因数正是这里面最大的一个质数,如12的最大质因数正是3。
所以我们首先要找到给定数字内的所有质数,从2开始(1无影响,直接跳过即可),找到一个质数,就从给定数中除掉,直到最后剩下的那一个质数,便是其最大质因数。
#include <stdio.h>
//最大质因数 解题思路,把每次找到的最小质因数除掉,最后剩下的质因数便是最大的
int main(int argc, char *argv[]) {
int num = 1;
printf("请输入所要进行计算的数字:");
scanf("%d",&num);
int x=2,ans = 0;
while (num != 1){
while (num % x !=0){ //num % x != 0寻找的是无关项,所以就直接加一即可
printf("无关项:%d\n",x);
x++;
}
ans = x;
printf("x 赋给了 ans = %d\n",ans); //上面的while循环在找到最小质因数后自动退出,留下的x正是最小质因数,我们把x的值赋给ans,以便x去计算新的最小质因数
while (num % x == 0){
num /= x;
printf("new_num = %d\n",num); //把x从num中除掉 ,采用循环是为了防止有时候一次没除干净,比如说那些带n次方的,像8 = 2x2x2,需要除3次2,才可以完成。
}
x++; //这个有关项,也就是最小质因数x已经从num中除掉,此时我们只要从下一个x进行计算即可。 执行完本句之后,此次while循环会结束,从而进入下一次的while循环
printf("new_x++ = %d\n",x);
}
printf("%d",ans);
return 0;
}