#include<iostream>
#define RANGE 1000
using namespace std;
//枚举算法 1
int enumeration_1(int range);
//枚举算法2
int enumeration_2(int range);
//公式算法
int formula(int range);
int main(){
//分别输出由三种算法得到的结果
cout << "enumeration_1:" << enumeration_1(RANGE) << endl;
cout << "enumeration_2:" << enumeration_2(RANGE) << endl;
cout << "formula:" << formula(RANGE) << endl;
return 0;
}
int enumeration_1(int range){
int sum=0;
//枚举出范围内所有自然数,判断是否为
//3或者5的倍数,如果满足则累加进sum变量
//时间复杂度为 O(n)
for(int i=1;i<range;i++){
sum += i%3==0 || i%5==0 ? i : 0;
}
return sum;
}
int enumeration_2(int range){
int sum=0;
//从0开始每次增加3必为3的倍数,无需判断直接累加进sum变量
for(int i=0;i<range;i+=3) sum+=i;
//同理,从0开始每次增加5必为5的倍数,但是要忽略掉那些同为
//3的倍数
//时间复杂度同为 O(n) 但对比枚举1有所减少
for(int i=0;i<range;i+=5){
sum += i%3==0 ? 0 : i;
}
return sum;
}
int formula(int range){
int sum=0;
//使用等差数列求和公式 (begin + end) * count / 2
//分别求出3和5的倍数和累加进sum变量
//时间复杂度为 O(1)
sum += ((range-range%3)+3) * ((range-range%3)/3) / 2;
sum += ((range-range%5)+5) * ((range-range%5)/5) / 2;
//3和5的公倍数,也就是15的倍数被重复累加,所以要减去
sum -= ((range-range%15)+15) * ((range-range%15)/15) / 2;
//因为题目表示为范围内,所以如果范围的数字正好是3或者5的倍数
//需要将范围数字本身减去
sum -= range%3==0 || range%5==0 ? range : 0;
return sum;
}
输出:enumeration_1:233168
enumeration_2:233168
formula:233168
--------------------------------
Process exited after 0.01357 seconds with return value 0
请按任意键继续. . .
|