针对计算给定数字的约数数量,最优算法(在性能上)是什么?
如果您能提供伪代码或示例链接,那将非常好。
编辑:所有答案都非常有帮助,谢谢。 我正在实现Atkin筛法,然后将使用类似于Jonathan Leffler指出的方法。 Justin Bozonier发布的链接提供了我所需的更多信息。
针对计算给定数字的约数数量,最优算法(在性能上)是什么?
如果您能提供伪代码或示例链接,那将非常好。
编辑:所有答案都非常有帮助,谢谢。 我正在实现Atkin筛法,然后将使用类似于Jonathan Leffler指出的方法。 Justin Bozonier发布的链接提供了我所需的更多信息。
@Kendall
我测试了你的代码并进行了一些改进,现在它更快了。 我还测试了@هومن جاویدپور的代码,这比他的代码更快。
long long int FindDivisors(long long int n) {
long long int count = 0;
long long int i, m = (long long int)sqrt(n);
for(i = 1;i <= m;i++) {
if(n % i == 0)
count += 2;
}
if(n / m == m && n % m == 0)
count--;
return count;
}
我认为这就是你要找的东西。它完全按照你的要求执行。 将其复制并粘贴到记事本中,保存为*.bat文件后运行。输入数字。将该过程乘以2,这就是约数的个数。我故意这样做是为了更快地确定约数:
请注意,CMD变量不支持超过999999999的值。
@echo off
modecon:cols=100 lines=100
:start
title Enter the Number to Determine
cls
echo Determine a number as a product of 2 numbers
echo.
echo Ex1 : C = A * B
echo Ex2 : 8 = 4 * 2
echo.
echo Max Number length is 9
echo.
echo If there is only 1 proces done it
echo means the number is a prime number
echo.
echo Prime numbers take time to determine
echo Number not prime are determined fast
echo.
set /p number=Enter Number :
if %number% GTR 999999999 goto start
echo.
set proces=0
set mindet=0
set procent=0
set B=%Number%
:Determining
set /a mindet=%mindet%+1
if %mindet% GTR %B% goto Results
set /a solution=%number% %%% %mindet%
if %solution% NEQ 0 goto Determining
if %solution% EQU 0 set /a proces=%proces%+1
set /a B=%number% / %mindet%
set /a procent=%mindet%*100/%B%
if %procent% EQU 100 set procent=%procent:~0,3%
if %procent% LSS 100 set procent=%procent:~0,2%
if %procent% LSS 10 set procent=%procent:~0,1%
title Progress : %procent% %%%
if %solution% EQU 0 echo %proces%. %mindet% * %B% = %number%
goto Determining
:Results
title %proces% Results Found
echo.
@pause
goto start
我猜这个会又方便又精确。
>>>因子=[ x for x in range (1,n+1) if n%x==0]
print len(因子)
这不就是一个因数分解的问题吗 - 确定数字的所有因数?然后您可以决定是否需要一个或多个因数的所有组合。
因此,一种可能的算法是:
factor(N)
divisor = first_prime
list_of_factors = { 1 }
while (N > 1)
while (N % divisor == 0)
add divisor to list_of_factors
N /= divisor
divisor = next_prime
return list_of_factors
然后就由你来组合这些因素来确定答案的其余部分。
int divisors(int myNum) {
int limit = myNum;
int divisorCount = 0;
if (x == 1)
return 1;
for (int i = 1; i < limit; ++i) {
if (myNum % i == 0) {
limit = myNum / i;
if (limit != i)
divisorCount++;
divisorCount++;
}
}
return divisorCount;
}
我不知道最有效的方法,但我会按照以下步骤进行:
应该可以正常工作 \o/
如果需要,我可以明天用C编写一些代码来演示。