【发布时间】:2017-05-29 22:05:19
【问题描述】:
完成 100,000 的限制(n)需要相当长的时间。
我怀疑问题出在 CalculateAmicable() 上,其中数字变大并且需要更多时间来计算。我可以改变什么让它比这更快?
public static void Main (string[] args)
{
CheckAmicable (1, 100000);
}
public static int CheckAmicable(int start, int end)
{
for (int i = start; i < end; i++) {
int main = CalculateAmicable (i); //220
int temp = CalculateAmicable (main); //284
int compare = CalculateAmicable (temp); //220
if (compare == main) {
if (main != temp && temp == i) {
Console.WriteLine (main + " = " + temp + " = " + compare + " i: " + i);
i = compare + 1;
}
}
}
return 0;
}
public static int CalculateAmicable(int number)
{
int total = 0;
for (int i = 1; i < number; i++) {
if (number%i == 0){
total += i;
}
}
return total;
}
注意:英语不是我的第一语言!
【问题讨论】:
-
在
CalculateAmicable中,您可以从 1 循环到number的平方根,然后每次将 2 加到总数中。 -
@xzoert 我和你的想法一样,但不认为它有效。要验证,请尝试将数字 9 插入现有方法。我认为相反,如果您从 1 循环到数字值的一半并将总数增加 1,这应该可以工作。
-
它确实有效。您每次都添加
total += i + number / i。您正在对除数求和,而不是得到它们的数量。您需要检查以避免添加number本身(使用 1)。 -
好收获。我正在 7 英寸平板电脑上阅读此内容,并且将 total += i 读取为 total += 1!
标签: c# algorithm optimization