给定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。 有没有其他方法可以更快地解决这个问题?
答案 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)
解决方案是:
考虑有序对,x> 0,y> 0。很容易推导出来:
函数可以渐近近似:(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
. . .
通过求和公式。