问题描述
最近,我编写了一个代码,用于查找C语言中“ int”数据类型范围内的数字的质因数。当我向我的朋友展示时,他告诉我,有更多优化的方法具有O(sqrt(n )),O(log(n))。当我运行时间复杂度为O(sqrt(n))的代码,并在Dev C ++上运行我的代码时,我发现这两个代码所花费的总时间几乎相同。我的代码的时间复杂度是多少?
#include <stdio.h>
int main(void)
{
int k = 2,n,m;
printf("enter a +ve integer greater than 1:- ");
scanf("%d",&n);
m = n;
do {
if (n % k == 0) {
n /= k;
printf("%d,",k);
}
if (n == 1)
break;
while (n % k != 0) {
if (k == 2)
k = 3;
else
k += 2;
}
} while (n % k == 0);
printf("prime factors of %d\n.",m);
return 0;
}
解决方法
时间复杂度分析是出于大N 的考虑。如果您还没有感觉到效果,则您的N不够大。我将%d
更改为%lld
,将int
更改为long long int
,并考虑了欧拉发现的梅森素数的平方,即(2³¹-1)²。>
结果:
% echo 4611686014132420609 | time ./a.out
enter a +ve integer greater than 1:- 2147483647,2147483647,prime factors of 4611686014132420609
../a.out 12.15s user 0.00s system 99% cpu 12.154 total
% echo 4611686014132420609 | time factor
4611686014132420609: 2147483647 2147483647
factor 0.00s user 0.00s system 87% cpu 0.001 total
即即使使用GCC和-O3进行编译,您的程序也需要比factor
程序大至少12000倍的CPU能力来分解数字。