Project Euler | Problem 1

Problem 1


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的倍数之和。


/*****************************  Program 1  *************************************
* 思路:
* 	1.通过循环制造出自然数
*	2.判断每一个自然数是否为公因数1或公因数2的倍数以筛选
*	3.累加这些自然数
* 收获:
*	1.1. 0 % 3 = 0;
* 评价:
*	优点:
*		1.简单明了
*		2.不会重复求和
*		3.代码量小
*	缺点:
*		1.效率低
*********************************************************************************/

/*---------------------------------------------------------------------------------*/

#define _CRT_SECURE_NO_WARNINGS
#define COMMOM_FACTOR_1ST   3
#define COMMOM_FACTOR_2ND   5
#define MAX_NATIONAL_NUMBER 1000

#include <stdio.h>

/*---------------------------------------------------------------------------------*/

int main()
{
	int sum = 0;
	for (int i = 1; i < MAX_NATIONAL_NUMBER; i++)// 收获1.1.
	{
		if (!(i % COMMOM_FACTOR_1ST) || !(i % COMMOM_FACTOR_2ND))
			sum += i;
	}
	printf("答案是:%d\n", sum);
 
	return 0;
}
/*****************************  Program 2  *************************************
* 思路:
* 	1.利用等差数列求和公式分别求出符合要求的公因数倍数的和
*	2.同理求出以公因数之积为公差的符合要求的部分和
*	3.A并B = A + B - A且B
* 收获:
*	2.1. 首项:first term
*	2.2. 等比数列:geometric progression
*	2.3. 公比:commom ratio
*	2.4. 项数:number of terms
*	2.5. 等差数列:arithmetic progression
*	2.6. 公差:tolerance
*	2.7. 末项:last term
*	2.8. 乘积:product
* 评价:
*	优点:
*		1.效率较高
*		2.有自检部分
*	缺点:
*		1.可能发生重复求和
*		2.代码长,不易解读
*********************************************************************************/
/*---------------------------------------------------------------------------------*/

#define _CRT_SECURE_NO_WARNINGS
#define COMMOM_FACTOR_1ST   3
#define COMMOM_FACTOR_2ND   5
#define MAX_NATIONAL_NUMBER 1000

#include <stdio.h>

/*---------------------------------------------------------------------------------*/

//求首项为 firstTerm ,末项为 lastTerm ,项数为 numberOfTerms 的等比数列的和
int TheSumOfArithmeticProgression(const int firstTerm, const int lastTerm, const int numberOfTerms)// 收获2.1~2.7
{
	return (firstTerm + lastTerm) * numberOfTerms / 2;
}

//求首项为 firstTerm ,项数为 numberOfTerms ,可能的最大值为 maxNationalNumber 的等比数列的末项
int FindLastTermOFArithmeticProgression(const int firstTerm, const int tolerance, const int maxNationalNumber)
{
	if (firstTerm > maxNationalNumber)
	{
		return 0;
	}
	return maxNationalNumber - ((maxNationalNumber - firstTerm) % tolerance);
}

int main()
{
	//3的倍数求和
	int numberOfTerms1st = FindLastTermOFArithmeticProgression(0, COMMOM_FACTOR_1ST, MAX_NATIONAL_NUMBER);
	int sumPart1st = TheSumOfArithmeticProgression(0, COMMOM_FACTOR_1ST, numberOfTerms1st);
	//5的倍数求和
	int numberOfTerms2nd = FindLastTermOFArithmeticProgression(0, COMMOM_FACTOR_2ND, MAX_NATIONAL_NUMBER);
	int sumPart2nd = TheSumOfArithmeticProgression(0, COMMOM_FACTOR_2ND, numberOfTerms2nd);
	//15的倍数求和
	int tneProductOfCommomFactors = COMMOM_FACTOR_1ST * COMMOM_FACTOR_2ND;// 收获2.8
	int numberOfTerms3rd = FindLastTermOFArithmeticProgression(0, tneProductOfCommomFactors, MAX_NATIONAL_NUMBER);
	int sumPart3rd = TheSumOfArithmeticProgression(0, tneProductOfCommomFactors, numberOfTerms3rd);

	//A并B = A + B - A且B
	if (sumPart1st && sumPart2nd && sumPart3rd)
	{
		int answer = sumPart1st + sumPart2nd - sumPart3rd;
		printf("答案是:%d\n", answer);
	}
	else//自检报错部分
	{
		printf("the firstTerm should not be bigger than maxNationalNumber.\n");
		printf("Please check tne code again.\n");
	}
	return 0;
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值