对数(a,b)使得a * b <1。 N其中a,b,N是大于0的整数

时间:2015-05-31 09:48:31

标签: c math counting

我在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  

此功能可正确计算此类对的数量。它背后的逻辑是什么?

2 个答案:

答案 0 :(得分:0)

说明图

考虑以下案例 N = 10 , 每个位置代表一对要计算的因素, a / N2- / *显示计算对时的算法阶段(如下所述)和{{1} }是一个占位符,用于标记在相关阶段中未计入的对:

.

算法说明

算法有效地做了什么,是:

  • 计算从2到 int(sqrt(N))的列(即在上述情况下为3,标有 | 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.. =)。
    • b 添加 N / b ,除非 b N 的因子,在这种情况下最后一个不算数。
  • 为第一列添加 N - 1 (标有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)

它的发生方式是:

  1. 计算平方根。因此,如果平方根不是(比方说)且N不是正方形,则可以自身乘以且小于N的最大允许数是否。
  2. 我们通过修复变量检查数字是否为正方形。如果数字是正方形,那么一种可能性更小,即没有*否= N不可能是这种情况。所以我们减去1,如代码所示:

    否则{
            ans =(2 * ans)+ N + fix - 1;          }

  3. 接下来我们运行一个从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个答案       等等编号。

  4. 现在每对(a,b)都会有一对(b,a),所以我们将ans乘以2.

  5. 到目前为止我们已经考虑了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添加。

  6. 最后,我们添加修复程序,以处理额外的案例,如果它不是正方形。