C语言 给定一个范围,求可被3或5整除的数之和

qmelpv7a  于 2023-01-25  发布在  其他
关注(0)|答案(1)|浏览(387)

下面的代码对于较小的数字非常有效,但是对于较大数字的时间膨胀给了我一个建议

#include<stdio.h>
int main()
{
  int num;
  int sum=0;
  scanf("%d",&num);
  for(int i=1;i<=num;i++)
  {
    if(i%3==0 || i%5==0)
    sum += i;
  }
  printf("%d",sum);
}

为此需要高效的代码
尝试减少代码所花费的时间。

h7appiyu

h7appiyu1#

答案可以用简单的算术运算来计算,不需要任何迭代。许多欧拉计划问题的目的是让你思考找到解决方案的聪明方法,而不仅仅是使用计算机的原始功能来进行计算。(这是Project Euler question 1,除了欧拉计划问题使用小于而不是小于或等于来指定极限。)
给定正整数 NF,小于或等于 NF 的正倍数的个数为 N/Fx 是不大于 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);
}

当你在做其他欧拉项目的问题时,你应该寻找类似的想法。

相关问题