前言
昨天发现了Project Euler,一个不错的Project,同时改善了数学、计算机、英语方面的思维和能力。
每天做一点也是正确的选择,今天就从第一题开始耕耘吧。
这个项目当你提交答案后,会得到一份题目剖析,应作者的希望,那pdf就不分享了。

题目描述
原文:
Multiples of 3 and 5
If we list all the natural numbers below 10 that are multiples of 3 or 5, we get 3, 5, 6 and 9. The sum of these multiples is 23.
Find the sum of all the multiples of 3 or 5 below 1000.
中文表达如下:
3和5的公倍数
如果我们列出10以下3和5的公倍数,我们得到3,5,6,9.这些公倍数的和是23.
求出1000以下3和5的公倍数的和。
简单方法
一种简单的思路如下(C语言实现):
# include <stdio.h>
# define NUM 1000
int main(void)
{
int n;
int i;
int sum;
sum = 0;
for(n = 1; n < NUM; n++) {
if(n % 3 == 0 || n %5 == 0) {
sum += n;
}
}
printf("%d", sum);
}
但是我们仔细想一下,当数量级逐步增大的过程中,也许我们需要更好的方法。
更有效的方法
我们可以计算(3的公倍数的和 + 5的公倍数的和 - 15的公倍数的和),再利用1+2+3+...+p=0.5*p*(p+1)求和公式,进一步减少时间复杂度:
# include <stdio.h>
# define NUM 1000
int sumdiv(int n);
int main(void)
{
printf("%d", sumdiv(3) + sumdiv(5) - sumdiv(15));
}
int sumdiv(int n)
{
int i;
i = (NUM - 1) / n; //注意边界值
return n * 0.5 * i * (1 + i);
}
时间复杂度从O(n)降到O(1)。
后记
这题的思路不难理解,但是对于曾经的我,还缺少灵活运用,首先想到的是简单方法。
提交答案后,看到Congratulations我也更兴奋了。

我也是28840分之一了。
分享到:
相关推荐
欧拉公式求长期率的matlab代码3和5的倍数 您的任务 如果我们列出所有低于10的自然数,它们是3或5的倍数,则得到3、5、6和9。这些倍数的总和为23。 编写代码在sumOfAMultiple函数体在multiples.js...来自欧拉计划问题1
欧拉公式求长期率的matlab代码欧拉计划 问题:3和5的倍数 如果我们列出所有低于10的自然数,它们是3或5的倍数,则得到3、5、6和9。这些倍数的总和为23。 找出1000以下3或5的所有倍数的总和。 指示 将您的过程解决...
欧拉公式求长期率的matlab代码EasyEuler EasyEuler是用于与Euler项目一起使用的可配置命令行工具。 它提供了对多种语言的开箱即用的支持,并且添加更多的语言很容易。 该项目的灵感来自于并打算为多种语言提供相同的...
1. **欧拉问题1:Multiples of 3 and 5** 这个问题是要求求和所有1到1000之间能被3或5整除的数。这是一个基础的数学与编程结合的问题,可以通过遍历并检查每个数来解决。在JavaScript中,可以使用for循环和条件语句...
Java/01.Multiples_of_3_and_5/your_user_name.java 添加 :check_mark_button: :white_check_mark:针对您已解决的问题的表格。 将PR命名为problem_number done in This_Lang的格式为problem_number done in This_...
1. **问题1:Multiples of 3 and 5** 要求找到所有小于1000且能被3或5整除的数之和。这个问题可以使用循环和条件判断来解决,通过累加符合条件的数来得到结果。 2. **问题2:Even Fibonacci numbers** 找到前...
1. **欧拉问题1:Multiples of 3 and 5** 第一个欧拉问题是计算1到1000之间所有3的倍数和5的倍数的和。这涉及到基础的循环结构和条件判断。在JavaScript中,我们可以使用`for`循环遍历1到1000的数字,对每个数字...
1. **问题1:Multiples of 3 and 5** 这个问题是欧拉项目中的第一个问题,要求找到1到1000以内3和5的倍数之和。在Java中,可以通过循环和条件判断实现,同时利用数学原理优化算法,避免不必要的计算。 2. **问题2...
例如,Euler项目的第1题是“Multiples of 3 and 5”,要求找到小于1000的所有3的倍数和5的倍数之和。在Scheme中,可以使用循环或递归来解决此问题,甚至利用函数式编程的特性,将问题分解为更小的函数,如找出所有...
#### §1.2 Greatest common divisors and least common multiples - **最大公约数(GCD)**: GCD是两个或多个整数共有的最大的正因子。 - **最小公倍数(LCM)**: LCM是能同时被两个或多个整数整除的最小正整数。 ####...
1. **问题1:Multiples of 3 and 5** 这个问题是关于计算1到1000内所有3的倍数和5的倍数的和。这个简单的任务引入了基本的循环结构(for或while)和条件语句(if)。在JavaScript中,可以使用`Array.prototype....