此代码给出整数的最小除数。但问题是我必须计算平方根。有没有办法让我不必明确计算平方根?
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");
}
答案 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
(但性能下降)