计算满足xy的正整数对的数量

时间:2014-04-05 20:03:06

标签: c++ optimization matrix

给定c> 0,我需要找出有多少正整数对x,y满足xy< C。 其中一种方法是

int No_Of_Factors(int n)
{
    if(n==0)
        return 0;
    int i,divisors=1,power;
    int N=sqrt(n);
    for(i=2;i<=N;i++)
     {
        power=0;
        while(n%i==0)
        {
            power++;
            n/=i;
        }
        divisors*=(power+1);
     }
     if(n>1)
      divisors*=2;
return divisors;
}

调用上述函数,该函数计算数字的所有因子,对于i = 1到c-1。例如,如果c = 17,我将调用i = 1到16的上述函数。 对于i = 16,函数返回5,因为16可以写为1 * 16,16 * 1,2 * 8,8 * 2,4 * 4。 有没有其他方法可以更快地解决这个问题?

4 个答案:

答案 0 :(得分:3)

正如其他人所指出的那样,你可以计算总和(i = 1..c-1)楼层((c-1)/ i)。但是,有一种更好的方法。请注意,x&lt; = sqrt(c-1)或y&lt; = sqrt(c-1)或两者都有。因此,以下方法也将起作用:

int sc = sqrt(c-1);
int ans = 0;
for (int i = 1; i <= sc; i++) ans += (c-1) / i;
return ans * 2 - sc * sc;

这里ans计算找到x和y的方式的数量,使得xy <= c-1且x <= sqrt(c-1)。还有ans个方法来找到x和y,使得xy&lt; = c-1和y&lt; = sqrt(c-1)。将这两个加在一起可以找到x和y的方法,使得xy&lt; = c-1,x&lt; = sqrt(c-1)和y&lt; = sqrt(c-1),因此我们减去那个号码。

答案 1 :(得分:1)

我会建议

的内容
#include <math.h>

int calc_num_pairs(int c)
{
    float n = c-1;
    int num_pairs=0;
    for(int i=1; i<=n; i++)
        num_pairs += floor(n / i);
    return num_pairs;
}

答案 2 :(得分:1)

解决方案是:

enter image description here

考虑有序对,x> 0,y> 0。很容易推导出来:

  • 第一因子x应该> = 1(根据定义)并且&lt; (C-1)
  • 将第一个因子固定为x然后你有底线((c-1)/ n)因子

函数可以渐近近似:(c-1)*(gamma + log(c-1))其中gamma是Euler-Mascheroni常数。

答案 3 :(得分:0)

您可以通过算术确定这一点。

如果XY&lt; C,然后

1 <= x < C, Y = 1
2 <= x < C/2, Y = 2
. . . 

通过求和公式。