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;
}