【欧拉计划第 1 题】3 或 5 的倍数 Multiples of 3 or 5

简介: 【欧拉计划第 1 题】3 或 5 的倍数 Multiples of 3 or 5

Problem 1 Multiples of 3 or 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.

问题 1 3 或 5 的倍数

如果我们列出所有小于 10 且是 3 或 5 的倍数的自然数,我们会得到 3、5、6 和 9。这些倍数之和是 23。

求 1000 以下所有 3 或 5 的倍数之和。

思路分析

暴力求解

常规思路,找到 1000 以内所有 3 或 5 的倍数,分别求和解决

优化思路

由于暴力解法的算法执行效率很低,需要重复遍历 1000 次,自然效率低下。我们只需要枚举 3 的倍数之和、5 的倍数之和,最后减去它们的最小公倍数之和,便可节省不少时间

1000 以内 k 的倍数和为

( 1000 − 1 ) k \large \frac{\left (1000-1 \right)}{k}k(10001)

代码实现

暴力求解

/*
 * @Author: coder-jason
 * @Date: 2022-04-04 22:59:48
 * @LastEditTime: 2022-04-04 23:00:56
 */
#include <iostream>
using namespace std;
int main()
{
   int sum = 0;
   for (int i = 0; i < 1000;i++){
         if (i % 3 == 0 || i % 5 == 0){
              sum += i;
         }
   }
   cout<<sum<<endl;
   return 0;
}

优化思路

/*
 * @Author: coder-jason
 * @Date: 2022-04-04 22:59:48
 * @LastEditTime: 2022-04-04 23:14:34
 */
#include <iostream>
using namespace std;
int calculate()
{
      int sum3 = 0, sum5 = 0, sum15 = 0;
      for (int i = 0; i <= (1000 - 1) / 3; i++)
      {
            sum3 += i * 3; //求出3的倍数的和
      }
      for (int i = 0; i <= (1000 - 1) / 5; i++)
      {
            sum5 += i * 5; //求出5的倍数的和
      }
      for (int i = 0; i <= (1000 - 1) / 15; i++)
      {
            sum15 += i * 15; //求出15的倍数的和
      }
      return sum3 + sum5 - sum15;
}
int main()
{
      cout << calculate();
      return 0;
}

答案:233168

通过啦,既然是第一次,还是截个图记录下叭。以后也要继续加油啊,数学的优雅永不过时!!


相关文章
|
6月前
|
算法 Java
求多个数的最大公约数及比例化简
求多个数的最大公约数及比例化简
51 1
|
8月前
|
算法 测试技术 C#
【矩阵】【方向】【素数】3044 出现频率最高的素数
【矩阵】【方向】【素数】3044 出现频率最高的素数
|
8月前
【每日一题Day184】LC2413最小偶倍数 | 数学
【每日一题Day184】LC2413最小偶倍数 | 数学
36 0
|
算法 C++
【基础算法】几种特殊数(素数、公约数、完全数、亲密数) & C++实现
素数又称为质数,它指在一个大于1的自然数中,除了1和它自身外,没法被其他自然数整除的数。比1大,但不是素数的数称为合数。0和1既不是素数,也不是合数。因为素数的分布没有明显的规律,所以在程序中一般根据素数的定义来判断该数是否为素数。例如哥德巴赫猜想:哥德巴赫通过大量的数据猜测,所有不小于6的偶数,都可以表示为两个奇素数之和。后人将其称之为“1+1”。并且,对于每个不小于9的奇数,都可以表示为三个奇素数之和。
357 0
【基础算法】几种特殊数(素数、公约数、完全数、亲密数) & C++实现
|
Java
JavaA除以B本题要求计算A/B,其中A是不超过1000位的正整数,B是1位正整数。你需要输出商数Q和余数R,使得A = B * Q + R成立。
JavaA除以B本题要求计算A/B,其中A是不超过1000位的正整数,B是1位正整数。你需要输出商数Q和余数R,使得A = B * Q + R成立。
105 0
076.计算高次方数的尾数
076.计算高次方数的尾数
135 0
每日一面 - 求与数字最接近的 2 的 N 次方
每日一面 - 求与数字最接近的 2 的 N 次方
每日一面 - 求与数字最接近的 2 的 N 次方
求一个数n次方后的末尾数(数论/快速幂)
hdu1061-Rightmost Digit hdu1097-A hard puzzle 这两个oj题目思路几乎一样,都是为了快速求出一个数n次方后的末尾数为都多少?
254 0
求一个数n次方后的末尾数(数论/快速幂)
|
算法
【欧拉计划第 1 题】Multiples of 3 or 5
【欧拉计划第 1 题】Multiples of 3 or 5
110 0
【欧拉计划第 1 题】Multiples of 3 or 5