整数的最小除数,不显式计算平方根

时间:2012-07-28 08:56:49

标签: c algorithm performance

此代码给出整数的最小除数。但问题是我必须计算平方根。有没有办法让我不必明确计算平方根?

int d,r,n;
scanf("%d",&n);
if(n%2==0)
{
    printf("2 is ans"); 
}
else
{
    r=sqrt(n);
    d=3;
    while((n%d!=0)&&d<r)
    {
        d=d+2; 
    }
    if(n%d==0)
        printf("ans is %d",d);
    else
        printf("ans is 1");
}

4 个答案:

答案 0 :(得分:7)

由于code-efficiency是其中一个标签,因此请稍微调整一下答案:

while ((n%d) && (d<n/d)) d+=2;

编译器更有可能以这种方式重用除法运算符的结果。

在我提出的循环版本上查看gcc -O3的编译器输出,每次迭代只有一个除法运算,结果用于两个比较:

L18:
        cmpl    %esi, %ecx
        jle     L13
        movl    %ebx, %eax
        addl    $2, %esi
        cltd
        idivl   %esi
        testl   %edx, %edx
        movl    %eax, %ecx
        jne     L18
        .p2align 4,,15
L13:

虽然while ((n%d) && d*d < n) d+=2;版本给出了:

L8:
        movl    %ecx, %eax
        imull   %ecx, %eax
        cmpl    %ebx, %eax
        jge     L3
        movl    %ebx, %eax
        addl    $2, %ecx
        cltd
        idivl   %ecx
        testl   %edx, %edx
        jne     L8
        .p2align 4,,15
L3:

很明显,每次迭代都会进行乘法和除法。

答案 1 :(得分:5)

不确定。而不是:

while((n%d!=0)&&d<r)

你可以写

while((n%d!=0) && d*d < n)

答案 2 :(得分:3)

您可以检查是否d < sqrt(n),而不是检查是否d*d < n

while((n%d!=0)&&d<r)

应该是

while((n%d!=0) && d*d < n)

答案 3 :(得分:1)

该算法使用平方根来减少循环中的迭代次数。大大减少。我不知道您对平方根有什么问题,但您可以使用these algorithms计算平方根,或者只需将d更改为d * d,将r更改为{{1这一行n或只是将while((n%d!=0)&&d<r)更改为r(但性能下降)