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;
}