C++ 有没有一种有效的方法来生成N小于X的因子数?

C++ 有没有一种有效的方法来生成N小于X的因子数?,c++,number-theory,C++,Number Theory,我是编程领域的初学者。我只想找到一个正整数N小于X的因子/除数。(X本身是N的一个因素)。我有一种幼稚的方法,对于N,X上的查询不起作用 这是我的方法 int Divisors(int n, int x) { int ans = 0; if (x < sqrt(n)) { for (int i = 1; i < x; i++) { if (n % i == 0) { ans++;

我是编程领域的初学者。我只想找到一个正整数
N
小于
X
的因子/除数。(
X
本身是
N
的一个因素)。我有一种幼稚的方法,对于
N
X
上的查询不起作用

这是我的方法

int Divisors(int n, int x) {
    int ans = 0;
    if (x < sqrt(n)) {
        for (int i = 1; i < x; i++) {
            if (n % i == 0) {
                ans++;
            }
        }
    } else
        for (int i = 1; i <= sqrt(n); i++) {
            if (n % i == 0) {
                if (n / i == i && i < x)
                    ans++;
                else {
                    if (i < x)
                        ans++;
                    if (n / i < x)
                        ans++;
                }
            }
        }
    return ans;
}
int除数(int n,int x){
int ans=0;
如果(x对于(inti=1;i这个问题的措辞有点混乱。
我假设您正在查找小于数字x的数字n的所有因子/除数集的大小,D,其中x是n的因子

一种更简单的方法是从所有数字1到x(不包括x)进行迭代,并使用模运算符
%

代码:

intnumodiv(intx,intn){
整数计数=0;

对于(inti=1;iwhy不好用?@maximum_prime_是_463035818),我的算法的最佳时间复杂度是O(sqrt(N))。对于Q查询,它需要O(Q*sqrt(N))。我正在寻找一个更好的算法。你不需要
x开始,找到x的素因子分解吗。(素因式分解是一组除以X的素数,包括幂或重复计数。例如,792的素因式分解为2³×3²×11µ。)然后,由于X是N的因子,将其移除以给出N/X并找到N/X的素因式分解,但当素数超过X时停止。将其添加到X的素因式分解中(添加重复计数)。结果是一个素数和重复计数列表,例如p0^r0•p1^r1•p2^r2•…然后候选因子为p0^i0•p1^i1•p2^i2•…表示0≤i0≤r0,0≤i1≤r1等…然后编写代码获取素数和重复计数列表,并根据上述边界迭代[i0,i1,i2,…]数组,并将乘积限制为小于X。迭代数组可以“里程表式”完成当数组中的最后一个元素递增时,如果它超过其界限或乘积超过X,则将其重置为零,迭代操作移动到数组中的前一个元素。当迭代操作移动到数组的第一个元素之前时,迭代就完成了。我现在看到您正在尝试优化t他和我认为在因子和除数上存在混淆。如果你想找到所有的素数除数,我建议你先创建一个素数列表对不起,但是你的解决方案比OP更糟糕。它速度慢而且错误,因为你的操作数顺序错误:
I%n==0
测试
n
除数
I,而不是相反。OP没有犯那个错误。谢谢你抓住我的错误。我在发布时没有看到它。我也没有意识到OP当时正在寻找算法的优化。我已经对问题进行了更改,添加了一个我试图解决的实际问题的示例。
int NumOfDiv(int x, int n){
  int count = 0;

  for(int i=1; i<x; i++){
    if(n % i == 0)  //This indicates that i divides n, having a remainder of 0, 
                      look up % as it is very useful with number theory
      count++;
  }

  return count;
}