001.3或5的倍数

题目:

如果我们将小于10的所有是3或5倍数的自然数列出来,我们得到3,5,6和9,它们的和是23。与之类似,计算1000以下所有是3或5的倍数的自然数的和。

想法1:

第一种思路就是通过i % 3 == 0 || i % 5 == 0这个表达式筛选出所有符合要求的数,然后进行依次相加即可。这个算法的时间复杂度为O(n);

代码实现:

#include<iostream>
using namespace std;

int main() {
int ans = 0;
for (int i = 0; i < 1000; i++) {
if (i % 3 == 0 || i % 5 == 0) {
ans += i;
}
}
cout << ans << endl;
return 0;

想法2:

第二种想法就是求出3的倍数和,再求出5的倍数和,然后进行相加。由于在相加过程中会重复相加3和5的最小公倍数,所以我们还得减去3和5的最小公倍数15的倍数和。对于求这三个数的倍数和问题,我们可以用等差数列进行求解.这个算法的时间复杂度为O(1);

代码实现:

#include<iostream>
using namespace std;

int main() {
/*int ans = 0;
for (int i = 0; i < 1000; i++) {
if (i % 3 == 0 || i % 5 == 0) {
ans += i;
}
}*/
int t3 = (3 + 999) * 333 / 2;
int t5 = (5 + 995) *199/ 2;
int t15 = (15 + 990) * 66 / 2;
cout << t3+t5-t15 << endl;
return 0;
}

 

posted @ 2021-05-02 20:49  花瓣飘落的地方  阅读(140)  评论(0编辑  收藏  举报