题目描述如下
最大质因数
13195的所有质因数为5、7、13和29。600851475143最大的质因数是多少?
这个题怎么做呢 ??
难道我先要求出 根号600851475143 以内的所有素数,然后从大到小的比较吗?
当然也是可行的,不过我们换一种看待数字的方式。
比如 看成一系列素数相乘的形式:
a = p1a1 ×p2a2×p3a3×p4a4 …
啥意思呢 比如 12 可以表示为 2 2 × 31
那么当表示成这个形式,我们要找的最大的质因数就呼之欲出了
不过好像还差一点
那怎么找到最大的?
先看另一个问题
如果给你一个数字,让你找到最小的素因子,你能找到吗?
简单呀,从2开始找,每次加一,直到可以整除,就是最小的
int x,i = 2; // x 为该数字,i所求为x的最小素因子
while(x % i != 0){
i ++;
}
printf("%d\n",i);//此时就找到了x的最小素因子
OK不
那找最大的呢?
转化一下问题
每次都把目前找到的素因子从x中除掉,最后找到的就是最大的。。
不断把问题转化为寻找目前最小的素因子
/************************************************************************* > File Name: 2.c > Author:Gin.TaMa > Mail:1137554811@qq.com > Created Time: 2019年01月02日 星期三 21时55分11秒 ************************************************************************/
#include<stdio.h>
#include<inttypes.h>
int main(){
int64_t num = 600851475143,x = 2,ans = 0;
while(num != 1){
while(num % x != 0){
x ++;
}
ans = x;
// 除掉num中的所有值为x的素因子
while(num % x == 0){
num /= x;
}
x ++;
}
printf("%"PRId64"\n",ans);
}
OK 自此最大质因数的问题就解决了