天天看點

Project Euler 001-006 解法總結 Problem 1. Problem 2  Problem 3 Problem 4 Problem 5 Problem 6

 Problem 1.

  Find the sum of all the multiples of 3 or 5 below 1000.

  題目要求找出所有1000以下的3或者5的倍數之和。   最簡便的方法是,計算出1000以下總共有多少個3、5、15的倍數,然後用等差數列求三種數分别之和,最後3、5的倍數和減去15的倍數和就得到了結果。   NOte:這是因為15的倍數多算了一遍,是以要減去。

 Problem 2 

  Find the sum of all the even-valued terms in the Fibonacci sequence which do not exceed four million.

  題目要求找出斐波那契數列中偶數之和。   我的方法是,斐波那契數列每三個連續的數中有一個為偶數,計算斐波那契數時用一個長度為3的資料完成緩存,每次循環完成三個數的更新,即計算三次斐波那契數,取偶數位相加即可。   最簡便的方法是,既然沒三個連續數就有一個為偶數,那個可以推出連續的三個偶數斐波那契數之間的關系,這樣就可以用長度為2的資料完成計算,而且計算量減少很多。

 Problem 3

  Find the largest prime factor of a composite number

  題目要求找出一個數的最大質因子。   我的方法是,首先除以所有為2的質因子,然後從3到sqrt(n)依次找出質因子。排序得到最大的,應該用周遊法得到。過程中參考了CSDN的一篇剪枝的方法(回退法除以所有同一個質因子)。

 Problem 4

  Find the largest palindrome made from the product of two 3-digit numbers.

  題目要求找出能分解為兩個三位數相乘的最大回文數。   我的方法是,判斷是否為回文數把每一位都提取出來,看前後是否相等。然後按照是以從999到100周遊啊和b的乘積判斷是否為回文數,避免重複。找到第一個回文數後,計算出還有可能的a、b是多少,然後再次周遊。最後對周遊的結果取最大值。   最簡便的方法是,在上述方法的基礎上,經過分析知道這個回文數一定是11的倍數,因為11是質數,則a或b必須為質數。在周遊時,可以判斷出a不是11的倍數時b的可能值範圍變成原來的1/11,運算量大大減少。

 Problem 5

  What is the smallest number divisible by each of the numbers 1 to 20?

  題目要求找出1~20的最小公倍數。   我的方法是首先用費馬方法實作最大公因子gcd的計算。然後從大到小依次計算前者最小公倍數與下一個數的最小公因子,然後得到所有數的最小公倍數。   最簡單的方法是,對這個公倍數進行分析,必然是小于k的一系列質數的乘積。如果知道質數表,那麼對于每一個小于k的質數為底計算floor(log),然後把所有這些質數的幂相乘就得到了最小公倍數。可以優化的一點是,對于大于sqrt(k)的質數,已經不可能為1次以上的幂了,直接設幂指數為1即可。

 Problem 6

  What is the di erence between the sum of the squares and the square of the sums?

  題目要求算出和的平方與平方和的差。   我的方法就是直接算,因為沒有想到一種方法可以減少運算量。   最簡便的方式,是把求和用高斯的方法計算,即n*(n+1)/2,同樣的,最好能得到平方和的計算公式。其實計算方法也很簡單,假設為三次多項式,用前四個值(含0)來解出系數。也可以參考百度百科平方和的排列組合法。