如果我們列出10以內所有3或5的倍數,我們將得到3、5、6和9,這些數的和是23。求1000以內所有3或5的倍數的和。
將問題分解為求1000以內所有3的倍數之和,以及求1000以內所有5的倍數之和兩個問題,進一步抽象為計算在max以內所有d的倍數之和。
事實上max以內所有d的倍數均是公差為d的等差數列,問題轉換為求等差數列的n項和。
首先,計算在max以內公差為d的等差數列項數,用n表示,則:n=(max-1)/d
其次,等差數列的第一項為d本身,通過等差數列前n項和公式求得結果,用s表示,則:s=nd+n(n-1)d/2
最後,由於本問題是求1000以內所有3或5的倍數的和,因此3和5的所有公倍數被重複計算,需要減去max以內所有15(最小公倍數)的倍數之和。
本演算法時間複雜度o(1),空間複雜度o(1)
// 在max以內,計算d的倍數之和
intsum
(int max,
int d)
計算結果輸出:
cout <<
sum(
1000,3
)+sum(
1000,5
)-sum(
1000,15
)<< endl;
#include
using
namespace std;
// 在max以內,計算d的倍數之和
intsum
(int max,
int d)
intmain()
備註:尤拉計畫 尤拉計畫001 3的倍數和5的倍數
題目 10以下的自然數中,屬於3和5的倍數的有3,5,6和9,它們之和是23.找出1000以下的自然數中,屬於3和5的倍數的數字之和。用窮舉法 如下 include int main printf d以下的自然數中,屬於3和5的倍數的數字之和為 d n max,sum return 0 這個 遍歷了...
尤拉計畫5(最小倍數)
2520是最小的能夠被1到10整除的數。最小的能夠被1到20整除的正數是多少?分析 實現min num 2520 while true isresult true 用於標記是否是能夠被1到20整除的數 for i in range 1 21 if min num i 0 pass else isre...
N的倍數 抽屜原理 字首和
題目傳送門 題意 給你n個數,要你從這n個數中選出幾個數,他們的和恰好是n的整數倍。輸出所選數的個數,和數。思路 這道題要用到容斥原理。首先,n個數有n個字首和,他們 n的餘數,要麼全部不相同,即0 n 1,這種情況,餘數為0的字首和就是所求的區間。另外一種情況就是,至少有2個字首和 n的餘數是相同...