347 Largest Integer Divisible by Two Primes
在所有小于 100 的整数中,能被两个质数整除的最大整数是 96,。我们定义函数 :对于不同的两个质数 , 是小于等于 中能被 整除的最大整数,如果不存在,。比如 后者而不是 90,因为 90 能被 2, 3, 5 整除。
是因为 ,小于 100 的数里面没有数能同时被 2 和 73 整除。
是对所有不同的 求和。
题目最后是求 。
解题思路很清晰,只是要尽可能早的排除不可能的质数组合。
首先获取 0 到 5 000 000 之间的质数,因为大于 5 000 000 的质数乘以最小的质数 2 也会大于 10 000 000,,不用考虑了。
然后就是组合每一个可能的指数对 ,获得 。
两层循环遍历 。不妨设p比较小,用遍历所有的质数吗?显然不用,当 大于 10 000 000 的平方时, 的乘积就会大于 10 000 000,。
也不用遍历所有大于 的质数,一旦 的乘积大于 10 000 000,就可以停止了。
给定 ,如何计算 呢?这里使用了暴力法,就是先通过 和 计算出可能的最大指数,然后两层循环,遍历所有可能的情况,得到小于等于 且能被 2 个质数整除的最大值。
大约 1s多一点就能得到结果了。
最后,贴一下我的代码:
const int MAX = 10000000;
public static long GetAnswer()
{
long sum = 0;
var primes = Utils.GenPrimes(MAX / 2);
for (int i = 0; primes[i] < Math.Sqrt(MAX); i++)
{
for (int j = i + 1; j < primes.Length; j++)
{
long p = primes[i];
long q = primes[j];
if (p * q < MAX)
{
sum += GetM(p, q);
}
else
{
break;
}
}
}
return sum;
}
private static long GetM(long p, long q)
{
var max = 0L;
var e1Max = (int)(Math.Log(MAX) / Math.Log(p));
var e2Max = (int)(Math.Log(MAX) / Math.Log(q));
for (int e1 = 0; e1 < e1Max; e1++)
{
for (int e2 = 0; e2 < e2Max; e2++)
{
var product = Math.Pow(p, e1 + 1) * Math.Pow(q, e2 + 1);
if (product <= MAX && product > max)
{
max = (long)product;
}
}
}
return max;
}