我正在阅读 MathBlog 上 Project Euler Problem 12 的解决方案,但我在理解代码背后的逻辑时遇到了一些麻烦。该程序使用素数分解来找到三角形数的除数。
private int PrimeFactorisationNoD(int number, int[] primelist) {
int nod = 1;
int exponent;
int remain = number;
for (int i = 0; i < primelist.Length; i++) {
// In case there is a remainder this is a prime factor as well
// The exponent of that factor is 1
if (**primelist[i] * primelist[i] > number**) {
return nod * 2;
}
exponent = 1;
while (remain % primelist[i] == 0) {
exponent++;
remain = remain / primelist[i];
}
nod *= exponent;
//If there is no remainder, return the count
if (remain == 1) {
return nod;
}
}
return nod;
}
除了突出显示的部分“primelist[i] * primelist[i] > number”外,我了解程序的大部分内容。我很难理解这行代码的必要性。我将用一个例子来说明我的观点。假设我有一个数字 510 = 2*3*5*17。仅当 Primelist 到达第 23 位时,突出显示的代码才会为真。但是当列表到达第 17 位时,条件保持 == 1 将为真,并且程序将退出循环。如果我将代码更改为 if(remain==primelist[i]) 会更好吗,因为当primelist变为数字17而不是21时循环将结束?