显然,lcm(i,n) (i=1,2,...,n,下面省略)肯定是能被n整除的,所以f(n)能被n整除,因此只要求出lcm(i,n)/n的值就可以了。我是这样分析lcm(i,n)的:它可以由i*n再约去两者的共同因子得到。因此,只要把i中两者的共同因子约去,再把结果相加起来便得到了lcm(i,n)/n。可以首先对n分解质因数,然后用i除以n的各质因数,如果能整除,则在i中约去该因子(因为该因子为两者的共同因子)。对每一个i执行以上步骤后,再把结果加起来就行了。
下面是C语言的完整代码:
#include<stdio.h>
void main()
{
long n, i, j;
printf("请输入数n (1 <= n <= 2000000000) :");
scanf("%ld", &n);
long prmfct[100]; // 存放n的质因数
int index = 0;
// 对n分解质因数
long x = n;
for (i=2; i<=x; i++)
{
while (x != i)
{
if (x%i == 0)
{
prmfct[index] = i;
x = x/i;
index++;
}
else break;
}
}
prmfct[index] = x;
// 求各项的值并相加
long s = 0;
for (i=1; i<=n; i++)
{
x = i;
for (j=0; j<=index; j++)
{
if (x%prmfct[j] == 0)
x /= prmfct[j];
else break;
}
s += x;
}
printf("f(n)/n = %d\n", s);
}
温馨提示:答案为网友推荐,仅供参考