最大质因数
13195的质因数包括5、7、13和29。
600851475143的最大质因数是多少?
质数就是这个数的因子只有1和它本身,也就是这个数只能通过n = 1 * n来得到。
第一种暴力解,我用了素数筛,什么是素数筛,一个数他可以通过它最小的质因子来乘得到,比如26 = 2 * 13来得到, 39 = 3 * 13,来得到 50 = 2 * 25 来得到所以通过这个特性来定义一个数组,代码如下
#include <stdio.h> #define max_n 600851475143 int prime[1000005] = {1, 1};//估算了这个值小于1000000 void is_prime(){ for(long long i = 2; i * i < 1000000; i++){ if(!prime[i]){//如果他不是质数就不进入内循环,因为如果它是合数的话它能乘以得到的数都已经标记 for(long long j = i; i * j < 1000000; j++){ prime[i * j] = 1;//标记合数 } } } return ; } int main(){ is_prime(); int ans = 0; for(int i = 2; i < 1000000; i++){ if(!prime[i] && max_n % i == 0) ans = i;//当它为质数并且是这个数的因子就用ans 赋值上,然后循环完成后,也就是他的最大质因子 } printf("%d\n", ans); return 0; }
第二种方法
一个合数都是通过质数的n次幂来相乘得到的
比如 25 = pow(5, 2)
100 = pow(2, 2) * pow(5, 2)
如果确实没有理解到可以去搜索相关解释
那通过这个逻辑就可以一直除下去,直到除到除数等于被除数,那被除数就是最大质因子
#include<stdio.h> int main(){ long long i = 2, number = 600851475143; while(number != 1){ i++; while(number % i == 0) number /= i;//i都是质数 } printf("%lld\n", i); }
最终答案为6857