Sum of naturals divisible by 3 and 5
Problem
用户输入一个正整数限制,计算在该正整数范围内的所有能够被 3 或 5 整除的自然数之和。
Solution
- 首先肯定要遍历一定范围的自然数,遍历的起点从 3 开始,因为 1 和 2 可能被 3 或 5 整除,遍历它们毫无意义,遍历的终点就是用户输出的限制值 N。则复杂度就是用户输入整数的线性增长,即输入的 N 愈大,则需要的计算时间愈大, T ( n ) = O ( N ) T(n)=\mathcal{O}(N) T(n)=O(N)。
- 利用取模运算来检查遍历的每一个自然数是否满足条件,即检查遍历的自然数对 3 或 5 进行模运算,检查余数是否等于零,满足条件则进行求和。
- 重点的问题在于考虑用户输入的值过大,计算求和式结果的储存,会不会出现溢出的情况;为了避免这种情况,对于储存的变量类型选择 long long 类型,这个可以进行测试。
Code
/**
* @file : main.cpp
* @brief : Sum of naturals divisible by 3 and 5
* @author : Wei Li
* @date : 2021-05-07
*/
#include <iostream>
int main(int argc, char** argv)
{
unsigned int limit = 0;
std::cout << "Please input upper limit:";
std::cin >> limit;
// the trick to being able to sum up to a larger limit
unsigned long long sum = 0;
// unsigned long sum = 0;
// unsigned int sum = 0;
for (unsigned int i = 3; i < limit; ++i)
{
// modulo operation to check
if (i % 3 == 0 || i % 5 == 0)
{
// std::cout << i << ' ';
sum += i;
}
}
// std::cout << std::endl;
std::cout << "Sum of natural numbers satisfying conditions: " << sum << std::endl;
return 0;
}
CMakeLists.txt
cmake_minimum_required(VERSION 3.10.0)
project(problem_01)
add_executable(problem_01 main.cpp)
Results
mkdir build
cd build
cmake .. -G "MinGW Makefiles"
mingw32-make
./problem_01.exe
// long long 类型
// Please input upper limit:1000000
// Sum of natural numbers satisfying conditions: 233333166668
// long 类型
// Please input upper limit:1000000
// Sum of natural numbers satisfying conditions: 1404932684
// int 类型
// Please input upper limit:1000000
// Sum of natural numbers satisfying conditions: 1404932684
Reference
- Book 《The Modern C++ Challenge》
- Github