我在C中使用此代码来计算此类对的数量::
Number n1 = 10;
System.out.println(n1 instanceof Number); //true
System.out.println(n1 instanceof Integer); //true
System.out.println(n1 instanceof Comparable); //true
此功能可正确计算此类对的数量。它背后的逻辑是什么?
答案 0 :(得分:0)
考虑以下案例 N = 10 ,
每个位置代表一对要计算的因素,
a
/ N
,2
和-
/ *
显示计算对时的算法阶段(如下所述)和{{1} }是一个占位符,用于标记在相关阶段中未计入的对:
.
算法有效地做了什么,是:
| 1 2 3 4 5 6 7 8 9
--+-~~~-===-===-----------------------
1 ! N2- a2- a2- .2. .2. .2. .2. .2. .2.
2 ! N2- a2- a2- .2.
3 ! N2- a2- a2*
4 | N.. a..
5 | N..
6 | N..
7 | N..
8 | N..
9 | N..
和=
)。
a
和~
)。N
和!
)。2
),其大小为 nr 2 ,如果 nr 2则减去一个 = N ,因为在这种情况下,我们不会计算(nr,nr)(标有-
而不是*
)。< / LI>
如果我们取消-
的计算和测试,fix
和代码的最后部分(和)的计算可能会重新排列如下:
fix
发布的代码,适度调整(假设C99 / MSVS 2012+)并评论:
ans = ans + N - 1; // Add in the first column
ans = 2 * ans; // Double to cover rows as well
if ( nr * nr != N ) // Equivalent to fix >= 0
ans = ans - nr * nr; // Subtract the square region counted twice
else
ans = ans - (nr * nr - 1); // We did not count (nr,nr)
答案 1 :(得分:0)
它的发生方式是:
我们通过修复变量检查数字是否为正方形。如果数字是正方形,那么一种可能性更小,即没有*否= N不可能是这种情况。所以我们减去1,如代码所示:
否则{
ans =(2 * ans)+ N + fix - 1;
}
接下来我们运行一个从2到平方根的循环,找到可以乘以每个循环元素的最大元素数,但仍然小于N.
例如,让N为15 对于b = 2,可以有N / 2 = 7个元素,可以乘以2并小于15 2X1,2X2 ......... 2X6,2X7我们为ans添加了7个答案 。对于b = 3 N / 3 = 5 所以可以有N / 3-1个元素,因为3 * 5 = 15是不允许的。 3X1,3 * 2 .... 3X4我们为ans添加了4个答案 等等编号。
现在每对(a,b)都会有一对(b,a),所以我们将ans乘以2.
到目前为止我们已经考虑了a和b到N / 2,因为我们使用了2的循环。在这种情况下(N = 15),最大a或b是7,如图所示。(2X7)。还存在N / 2个值,当乘以1时小于N.在这个(N = 15)的情况下是8,9,10,11,12,13,14。所以会有2 *(N / 2)。即,添加到ans的N个案例。 所以ans由N添加。
最后,我们添加修复程序,以处理额外的案例,如果它不是正方形。