答案可以用简单的算术运算来计算,不需要任何迭代。许多欧拉计划问题的目的是让你思考找到解决方案的聪明方法,而不仅仅是使用计算机的原始功能来进行计算。(这是Project Euler question 1,除了欧拉计划问题使用小于而不是小于或等于来指定极限。) 给定正整数 N 和 F,小于或等于 N 的 F 的正倍数的个数为 N/F(x 是不大于 x 的最大整数)。例如,小于或等于999的5的倍数的个数为999/5 = 199.8 = 199。 设 n 为倍数 N/F。 第一个倍数为 F,最后一个倍数为 n·F。例如,对于1000和5,第一个倍数为5,最后一个倍数为200·5 = 1000。 这些倍数的间隔是均匀的,所以所有倍数的平均值等于第一个和最后一个倍数的平均值,所以它是(F + nF)/2。 倍数的总和等于它们的平均值乘以它们的个数,所以 F 小于 N 的倍数的总和是 n ·(F + n·F)/2。 将3的倍数之和与5的倍数之和相加包括3和5的倍数的两倍。我们可以通过减去这些数字之和来纠正这一点。3和5的倍数都是15的倍数。 因此,我们可以使用简单的算法来计算所请求的总和,而无需任何迭代:
#include <stdio.h>
static long SumOfMultiples(long N, long F)
{
long NumberOfMultiples = N / F;
long FirstMultiple = F;
long LastMultiple = NumberOfMultiples * F;
return NumberOfMultiples * (FirstMultiple + LastMultiple) / 2;
}
int main(void)
{
long N = 1000;
long Sum = SumOfMultiples(N, 3) + SumOfMultiples(N, 5) - SumOfMultiples(N, 3*5);
printf("%ld\n", Sum);
}
1条答案
按热度按时间h7appiyu1#
答案可以用简单的算术运算来计算,不需要任何迭代。许多欧拉计划问题的目的是让你思考找到解决方案的聪明方法,而不仅仅是使用计算机的原始功能来进行计算。(这是Project Euler question 1,除了欧拉计划问题使用小于而不是小于或等于来指定极限。)
给定正整数 N 和 F,小于或等于 N 的 F 的正倍数的个数为 N/F(x 是不大于 x 的最大整数)。例如,小于或等于999的5的倍数的个数为999/5 = 199.8 = 199。
设 n 为倍数 N/F。
第一个倍数为 F,最后一个倍数为 n·F。例如,对于1000和5,第一个倍数为5,最后一个倍数为200·5 = 1000。
这些倍数的间隔是均匀的,所以所有倍数的平均值等于第一个和最后一个倍数的平均值,所以它是(F + n
F
)/2。倍数的总和等于它们的平均值乘以它们的个数,所以 F 小于 N 的倍数的总和是 n ·(F + n·F)/2。
将3的倍数之和与5的倍数之和相加包括3和5的倍数的两倍。我们可以通过减去这些数字之和来纠正这一点。3和5的倍数都是15的倍数。
因此,我们可以使用简单的算法来计算所请求的总和,而无需任何迭代:
当你在做其他欧拉项目的问题时,你应该寻找类似的想法。