C 计算整数的所有因子的最快算法是什么?

C 计算整数的所有因子的最快算法是什么?,c,algorithm,numbers,factors,C,Algorithm,Numbers,Factors,我已经写了这段代码,但它是消耗大量的时间来计算。。。 你能帮我找到一个有效的方法吗 int tag; int* factors(int n) { int a[1000000]; for(int i=1;i<=n/2;i++) if(n%i==0) a[++tag]=i; a[++tag]=n; return(a); } int标签; 整数*因子(整数n) { INTA[1000000]; 对于(int i=1;i到目

我已经写了这段代码,但它是消耗大量的时间来计算。。。 你能帮我找到一个有效的方法吗

int tag;
int* factors(int n)
{
    int a[1000000];
    for(int i=1;i<=n/2;i++)
        if(n%i==0)
            a[++tag]=i;
    a[++tag]=n;
    return(a);
}
int标签;
整数*因子(整数n)
{
INTA[1000000];

对于(int i=1;i到目前为止,还没有人提出一个更快的算法。这并不一定意味着没有任何算法,因为另一方面,也没有证据表明不可能更快

您可能需要考虑的一个优化是,不需要搜索多达n/2的数据,当达到sqrt(n)时,您可以停止搜索

…如果您真的想返回“chris”评论中已经提到的所有候选列表,请确保为您的号码选择不同的存储位置

编辑:

正如我所注意到的,在时间复杂度方面,有相当多的算法可用,可能比您所问的算法运行得快一点,可能会比上面给出的简短评论多添加几个词

虽然在第一次将循环分解为奇数后,通过以2步为单位运行循环来保证计算时间的最明显的可能性之外,还有一些其他可用的技巧,但在上面给出的答案中,我没有提到它们,因为它们大大快了

导致这一决定的主要原因是,例如,与运行时的预期增长相比,将迭代次数减少2倍似乎是一个巨大的胜利,但以常数衡量的增益变得如此之小,以至于在复杂性理论中,甚至不会有任何不同所有算法和这两种算法的时间复杂度(几乎)相同

即使有可能获得原始算法运行时数千亿倍的常数,它们之间仍然没有任何区别

数字越大,对任何常数的影响就越小。如果它也随着你所处理的数字的大小而迅速增长,那么它在运行时可能会像你想象的那样大

在时间复杂性方面,一个非常特殊的障碍通常被认为是实际可行和不可能之间的边界,即所谓的
多项式
运行时

这意味着,尽管运行时可能会随着
n
的增长而急剧增长,但仍然可以使用常数指数
k
来描述这种增长,这样运行时就是
n^k
附近的某个地方

另一方面,没有
多项式
运行时的算法不能用任何指数来衡量,不管你想让它有多大

为了举例说明为什么这种差异可能真的很重要,让我们来看看两个假想的算法。第一个有多项式运行时,比如“代码> n^ 10 < /代码>,而另一个则用运行时<代码> n!< /代码>。 虽然这对小数字来说似乎并不坏,但假设n仅为10,这里的算法1需要
10^10=1000000000
时间单位,而只有
3628800
单位,我们的第二个算法似乎运行得更快

我们的算法二的问题是,与算法一相比,它的运行时间将显著加快。在
n=100
时,算法一的运行时间将类似于:
1000000000000000000
,而算法一的运行时间已经类似于
93326215544394415268169923885626670049071596826438162468592963895217599932299159414639761算法二的56518286253697920827223758251185210916864000000000000000000000000

通过
n=1000
进一步推进前沿,我们最终得到的是:算法一位于
10000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000,而我们的第二个算法将采用类似于
402877272600600600600600600909974245040870737599188236277271887325197795059509952761208749754624970436014182780946464962910563938874378864873371191810458257836478499770124766328898359557354325131853239584630755574091142624174743493475534286465766116677973966688202912073791438537195882498081268678383745597317461360853795345242215865932019280908782973084313928444032812315586110369768013573042161687476096758713483120254785893207671691324484262361314125087802080002616831510273418279777047846358681701643650241536913982812648102130927612448963599287051149649754199093422215668325720808213331861168115536158365469840467089756029009505376164758477284218896796462449451607653534081989013854424879849599533191017233555566021394503997362807501378376153071277619268490343526252000158885351473316117021039681759215109077880193931781141945452572238655414610628921879602238389714760885062768629671466746975629112340824392081601537808898939645182632436716167621791689097799119037540312746222899880051954444142820121873617459926429565817466283029555702990243241531816172104658320367869061172601587835207515162842255402651704833042261439742869330616908979684825901254583271682264580665267699586526822728070757813918581788896522081643483448259932660433676601769996128318607883861502794659551311565520360939881806121385586003014356945272242063446317974605946825731037900840244324384656572450144028218852524709351906209290231364932734975655139587205596542287497740114133469627154228458623773875382304838656889764619273838149001407673104466402598994902222217659043399018860185665264850617997023561938970178600408118897299183110211712298459016419210688843871218556461249607987229085192968193723886426148396573822911231250241866493531439701374285319266498753372189406942814341185201580141233448280150513996942901534830