【发布时间】:2014-04-21 17:33:24
【问题描述】:
下面的代码完美运行,但我希望有人向我解释它背后的数学原理。基本上,它是如何工作的?
#include <stdio.h>
#include <stdlib.h> /* atoi */
#define min(x, y) (((x) < (y)) ? (x) : (y))
int main(int argc, char* argv[])
{
const int base = 16;
int n,i,j,p,c,noz,k;
n = 7; /* 7! = decimal 5040 or 0x13B0 - 1 trailing zero */
noz = n;
j = base;
/* Why do we start from 2 */
for (i=2; i <= base; i++)
{
if (j % i == 0)
{
p = 0; /* What is p? */
while (j % i== 0)
{
p++;
j /= i;
}
c = 0;
k = n;
/* What is the maths behind this while loop? */
while (k/i > 0)
{
c += k/i;
k /= i;
}
noz = min(noz, c/p);
}
}
printf("%d! has %d trailing zeros\n", n, noz);
return 0;
}
【问题讨论】:
-
为什么从base 2开始?因为
j % 1不会有余数。 -
@Marc B: 变量
p计算变量j的值可被变量i的值整除的次数,它只对变量的素数进行计算i(由于j /= i)。循环从 2 开始,因为这是最小的素因子。 -
@MarcB 这不是一个很好的解释,因为 1 实际上是一个除数,所以为什么不考虑它呢?原因是我们只想要素数
标签: c algorithm math number-theory