前言:PE(Project Eluer)是学Mathematica(以后我简称Mma)接触到的,不用提交代码,只用提交答案的答题网站。PE的题目会给出C++和Mma代码实现,以此学习Mma(已经被它的简洁给折服了..)。
题目
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.
https://projecteuler.net/problem=1
分析
这是PE第一题,求的是1000以下是3或者5的倍数的数之和,比较简单。
n 暴力解法:直接for 1 to 100把3或者5的倍数之和算出来。执行100次。
n 分开解法:把3和5做两个并列分开算,即两个for循环,但是整除15数计算重复,需要要减去一次,执行33+20+6=60次。
n 等差公式法:Sum = a1*n+n*(n-1)/2*d;(本题d与首项a1相等),时间复杂度(1)。
Code
#include<iostream>
int MulSum(int max, int a);
int main(){
int max= 999;
int a = MulSum(max,3);
int b = MulSum(max, 5);
int c = MulSum(max, 15);
int e = a + b - c;
std::cout << e;
return 0;
}
int MulSum(intmax,inta){//a为范围,b为整除数字,即为等差数列首项,也是公差
int n = max/ a;//项数
return n*a + (n*(n - 1)) / 2 * a;
}
Mathematica
暴力法:Select[Range[3, 999], Mod[#, 3] == 0 || Mod[#, 5] == 0 & ] // Total
分开法:{Range[3, 999, 3], Range[5, 999, 5]} // Flatten // Union // Total
公式法:Sum[i,{i,3,99,3}] + Sum[i, {i, 5, 999, 5}] - Sum[i, {i, 15, 999, 15}]