Я просто хотел увидеть несколько реальных пробежек. √ c кажется наилучшим сценарием. Я подозреваю, что это происходит, когда a = 0
и b * b = c
, что устраняет необходимость в нескольких прогонах внешнего l oop.
prints:
i = 10 sqrt = 3 runs = 8
i = 100 sqrt = 10 runs = 11
i = 1,000 sqrt = 31 runs = 351
i = 10,000 sqrt = 100 runs = 101
i = 100,000 sqrt = 316 runs = 4,121
i = 500,000 sqrt = 707 runs = 71,501
i = 1,000,000 sqrt = 1,000 runs = 1,001
i = 5,000,000 sqrt = 2,236 runs = 521,209
i = 10,000,000 sqrt = 3,162 runs = 382,721
i = 50,000,000 sqrt = 7,071 runs = 7,079,001
i = 100,000,000 sqrt = 10,000 runs = 10,001
Напечатано с:
public class StackOverflowTest {
static int counter;
public static void main(String[] args) {
print(10);
print(100);
print(1000);
print(10000);
print(100000);
print(500000);
print(1000000);
print(5000000);
print(10000000);
print(50000000);
print(100000000);
}
static void print(int i) {
new Solution().judgeSquareSum(i);
String format = " i = %,12d\tsqrt = %,6d\truns = %,12d\n";
System.out.printf(format,i,(int)Math.sqrt(i),counter);
}
static class Solution { // only added a counter
public boolean judgeSquareSum(int c) {
counter = 0;
for (long a = 0; a * a <= c; a++) {
for (long b = 0; b * b <= c; b++) {
counter++;
if (a * a + b * b == c)
return true;
}
}
return false;
}
}
}