`
xitong
  • 浏览: 6400933 次
文章分类
社区版块
存档分类
最新评论

【欧拉计划1】Multiples of 3 and 5

 
阅读更多

前言

昨天发现了Project Euler,一个不错的Project,同时改善了数学、计算机、英语方面的思维和能力。

每天做一点也是正确的选择,今天就从第一题开始耕耘吧。

这个项目当你提交答案后,会得到一份题目剖析,应作者的希望,那pdf就不分享了。

Please do not deprive others of going through the same process by publishing your solution outside Project Euler.

题目描述

原文:

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我也更兴奋了。

Congratulations, the answer you gave to problem 1 is correct.

我也是28840分之一了。

分享到:
评论

相关推荐

    欧拉公式求圆周率的matlab代码-Challenge-Multiples-of-3-and-5:3和5的倍数-从欧拉计划问题1中

    欧拉公式求长期率的matlab代码3和5的倍数 您的任务 如果我们列出所有低于10的自然数,它们是3或5的倍数,则得到3、5、6和9。这些倍数的总和为23。 编写代码在sumOfAMultiple函数体在multiples.js...来自欧拉计划问题1

    欧拉公式求圆周率的matlab代码-mod-1-whiteboard-challenge-multiples-of-three-and-fiv

    欧拉公式求长期率的matlab代码欧拉计划 问题:3和5的倍数 如果我们列出所有低于10的自然数,它们是3或5的倍数,则得到3、5、6和9。这些倍数的总和为23。 找出1000以下3或5的所有倍数的总和。 指示 将您的过程解决...

    欧拉公式求圆周率的matlab代码-EasyEuler:ProjectEuler的命令行工具

    欧拉公式求长期率的matlab代码EasyEuler EasyEuler是用于与Euler项目一起使用的可配置命令行工具。 它提供了对多种语言的开箱即用的支持,并且添加更多的语言很容易。 该项目的灵感来自于并打算为多种语言提供相同的...

    project-euler:奥丁计划 - 欧拉计划问题

    1. **欧拉问题1:Multiples of 3 and 5** 这个问题是要求求和所有1到1000之间能被3或5整除的数。这是一个基础的数学与编程结合的问题,可以通过遍历并检查每个数来解决。在JavaScript中,可以使用for循环和条件语句...

    欧拉公式求圆周率的matlab代码-Project-Euler:发送公关以做出贡献,并让代码管理员解决一些令人难以置信的难题

    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_...

    euler-practice:欧拉实践

    1. **问题1:Multiples of 3 and 5** 要求找到所有小于1000且能被3或5整除的数之和。这个问题可以使用循环和条件判断来解决,通过累加符合条件的数来得到结果。 2. **问题2:Even Fibonacci numbers** 找到前...

    Euler_problmes_1-3

    1. **欧拉问题1:Multiples of 3 and 5** 第一个欧拉问题是计算1到1000之间所有3的倍数和5的倍数的和。这涉及到基础的循环结构和条件判断。在JavaScript中,我们可以使用`for`循环遍历1到1000的数字,对每个数字...

    ProjectEuler:欧拉项目问题的解决方案

    1. **问题1:Multiples of 3 and 5** 这个问题是欧拉项目中的第一个问题,要求找到1到1000以内3和5的倍数之和。在Java中,可以通过循环和条件判断实现,同时利用数学原理优化算法,避免不必要的计算。 2. **问题2...

    project-euler:使用不同语言的项目欧拉实验

    例如,Euler项目的第1题是“Multiples of 3 and 5”,要求找到小于1000的所有3的倍数和5的倍数之和。在Scheme中,可以使用循环或递归来解决此问题,甚至利用函数式编程的特性,将问题分解为更小的函数,如找出所有...

    四川大学 初等数论 洪绍方 英文版

    #### §1.2 Greatest common divisors and least common multiples - **最大公约数(GCD)**: GCD是两个或多个整数共有的最大的正因子。 - **最小公倍数(LCM)**: LCM是能同时被两个或多个整数整除的最小正整数。 ####...

    EulerProject

    1. **问题1:Multiples of 3 and 5** 这个问题是关于计算1到1000内所有3的倍数和5的倍数的和。这个简单的任务引入了基本的循环结构(for或while)和条件语句(if)。在JavaScript中,可以使用`Array.prototype....

Global site tag (gtag.js) - Google Analytics