一、Project Euler 01:Multiples of 3 and 5
Multiples of 3 and 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、问题描述
如果一个数小于10,且能被3和5整除,这样的数有3,5,6,9,他们的和一共是23.
请找出小于1000,且能被3和5整除的数的和。
答案为:233168
2、第一遍刷Project Euler
思路比较简单,直接遍历1000以内的所有数,然后累加能被3和5整除的数。
python版本的代码:
def multiples(x):
num = 0
for i in range(x):
if i%3==0 or i%5==0:
num += i
return num
print(multiples(1000))
C++版本的代码:
#include<iostream>
void multiples(int x)
{
int num = 0;
for (int i = 0; i < x; i++)
{
if ((i%3==0)||(i%5==0))
{
num += i;
}
}
std::cout << num << std::endl;
system("pause");
}
void main()
{
multiples(1000);
}
二、Project Euler 02:Even Fibonacci numbers
Even Fibonacci numbers:
Each new term in the Fibonacci sequence is generated by adding the previous two terms. By starting with 1 and 2, the first 10 terms will be:
1, 2, 3, 5, 8, 13, 21, 34, 55, 89, ...
By considering the terms in the Fibonacci sequence whose values do not exceed four million, find the sum of the even-valued terms.
1、问题描述
Fibonacci数列中的每一项都是由前两项累加得到的,前两项分别为1和2,由此可以得到Fibonacci数列的前10项。
如果一个Fibonacci数列中的所有数都不超过4000000,对这个数列中偶数值的项进行求和。
答案为:4613732
2、第一遍刷Project Euler
思路:将所有的Fibonacci数列保存,然后对其偶数值的项进行求和。
python版本代码:
# 求Fibonacci数列的函数
def Fibonacci(n):
if (n==1):
return 1
elif (n==2):
return 2
else:
return Fibonacci(n-1) + Fibonacci(n-2)
# 对偶数值的项求和
def main(max_num):
# 找到小于max_num的所有Fibonacci数列
result = [1,2]
for i in range(3, max_num):
result.append(Fibonacci(i))
if Fibonacci(i) > max_num:
result.pop(-1)
break
# 累加偶数值的项
count = 0
for value in result:
if value%2==0:
count += values
print(count)
# 执行程序
if __name__=="__main__":
main(4000000)
C++版本为:
#include<iostream>
int Fibonacci(int x)
{
if (x==1)
{
return 1;
}
else if (x==2)
{
return 2;
}
else
{
return Fibonacci(x - 1) + Fibonacci(x - 2);
}
}
void main()
{
int count = 2;
for (int i = 3; i < 4000000; i++)
{
if (Fibonacci(i) > 4000000)
{
break;
}
else
{
if (Fibonacci(i)%2==0)
{
count += Fibonacci(i);
}
}
}
std::cout << count << std::endl;
system("pause");
}
三、Project Euler 03:Largest prime factor
Largest prime factor
The prime factors of 13195 are 5, 7, 13 and 29.
What is the largest prime factor of the number 600851475143 ?
1、问题描述
质数指只能够被1和本身整除的数。
如果对13195分解质因数,其结果为5,7,13,29.
那么对600851475143进行分解质因数,其最大的质数为多少?
答案为:6857
2、第一遍刷Project Euler
思路:需要定义两个函数,第一个函数用于判断一个数是否为质数,以便于后续调用这个函数来找寻质因数,另一个函数用于分解一个数的质因数,然后将质因数保存到list中,并输出最后一个质数,输出结果即为我们所求的结果。下面直接给出代码:
python版本代码:
import numpy
# 判断一个数是否为质数
def is_prime(x):
for i in range(2, int(numpy.sqrt(x))+1): # 求平方根可以用numpy.sqrt()
if x % i == 0:
return False
return True
# 找出一个数的所有质数
def find_prime(y):
all_prime = [] # 定义一个list,用于存储所有质数
for j in range(2, (int(y**0.5)+1)): # 求平方根可以用y**0.5
if is_prime(j):
if y % j == 0:
y /= j
all_prime.append(j) # 将找到的质数放入list中
print(all_prime[-1]) # 打印最后一个质数
if __name__ == '__main__':
find_prime(600851475143)
C++版本代码需要用到vector,代码为:
#include<iostream>
#include<vector>
bool is_prime(int x)
{
for (int i = 2; i < ceil(sqrt(x)); i++)
{
if (x%i==0)
{
return false;
}
}
return true;
}
void main()
{
//需要注意的是这里的类型必须写成long long int
long long int input = 600851475143;
std::vector<int> all_prime;
for (int i = 2; i < ceil(sqrt(input)); i++)
{
if (is_prime(i))
{
if (input%i==0)
{
all_prime.push_back(i);
}
}
}
std::cout << all_prime.back() << std::endl;
system("pause");
}
四、Project Euler 04:Largest palindrome product
Largest palindrome product
A palindromic number reads the same both ways. The largest palindrome made from the product of two 2-digit numbers is 9009 = 91 × 99.
Find the largest palindrome made from the product of two 3-digit numbers.
1、问题描述
回文数(palindromic number)指的是不管从哪边读都是一样的数字,且能够被分解为两个数的乘积。
比如一对由两个数字组成的最大回文数(palindromic number)是9009,且9009=91×99.
那么找出一对由三个数字组成的最大回文数(palindromic number)。
答案是:906609
2、第一遍刷Project Euler
思路:回文数非常有特点,如果三个数字分别为abc,那么组成的回文数为abccba,据此可以写一个函数来生成所有的三个数字组成的回文数。同时,回文数能够分解为两个数的乘积。三个数字组成的6位数,最大可以分解为两个1000×1000以内的数,据此可以写一个分解回文数的函数。最后需要找到这个回文数,找到之后推出程序即可。
python版本的代码为:
# 生成回文数的函数
def pal_num(a, b, c):
return a * 100001 + b * 10010 + c * 1100
# 分解回文数的函数
def can_be_divided(x):
for i in range(999, 0, -1):
for j in range(999, 0, -1):
if (i*j)==x:
print(x, " can be divided by ", i, " and ", j)
return True
return False
# 找最大的回文数
def main():
for a in range(9, 0, -1):
for b in range(9, -1, -1):
for c in range(9, -1, -1):
x = pal_num(a, b, c)
if can_be_divided(x):
break
if __name__ == '__main__':
main()
# 输出结果为:906609 can be divided by 993 and 913
C++版本的代码为:
#include<iostream>
#include<vector>
int pul_num(int a, int b, int c)
{
return a * 100001 + b * 10010 + c * 1100;
}
bool can_be_divided(int x)
{
for (int i = 999; i > 0; i--)
{
for (int j = 999; j > 0; j--)
{
if (i*j==x)
{
std::cout << x << " can be diveded by " << i << " and " << j << std::endl;
return true;
}
}
}
return false;
}
void main()
{
for (int a = 9; a > 0; a--)
{
for (int b = 9; b >= 0; b--)
{
for (int c = 9; c >= 0; c--)
{
int x = pul_num(a, b, c);
if (can_be_divided(x))
{
goto breakloop;
}
}
}
}
breakloop: system("pause");
}
五、Project Euler 05:Smallest multiple
Smallest multiple
2520 is the smallest number that can be divided by each of the numbers from 1 to 10 without any remainder.
What is the smallest positive number that is evenly divisible by all of the numbers from 1 to 20?
1、问题描述
最小公倍数问题。从1到10的最小公倍数是2520。即2520能够被1,2,......,10之间的任意数整除。
那么从1到20的最小公倍数是多少?
答案为:232792560
2、第一遍刷Project Euler
思路:从1到20的最小公倍数的关键是要找出1到20的所有质数的乘积。因为质数除了1和自身,没有任何其他因数。因此,从1到20的最小公倍数,必然是20以内所有质数乘积的整数倍,因此我们可以按照这个思路来找1到20的最小公倍数。
首先我们应该先找到20以内的所有质数,然后求得这些质数的乘积。然后在这个乘积的基础上进行1到20的最小公倍数的寻找。
python版本的代码为:
import numpy
# 找到x以内的所有质数
def is_prime(x):
for i in range(2, int(numpy.sqrt(x)) + 1):
if x % i == 0:
return False
return True
# 判断这个数能否被20以内的所有合数(即非质数)整除
def all_divided(a, b, c):
"""
函数功能:b表示所有质数的乘积,a表示这个乘积的倍数,c这里取20,表示20以内的数
"""
num = a*b # 我们要进行判断的数
for factor in range(c, 1, -1): # 判断这个数能否被c以内的所有数整除
if num%factor != 0:
return False
return True
def main(x):
# 定义质数的乘积初始值为1
product_prime = 1
for i in range(1, x+1):
if is_prime(i):
product_prime *= i # 求所有质数的乘积
# 以这个乘积为标准,找寻1到20以内的最小公倍数,暂且定义循环10000次
for j in range(1, 10000):
if all_divided(j, product_prime, x):
print(j*product_prime) # 找到后打印这个数,然后结束程序
break
if __name__ == '__main__':
main(20)
C++版本代码为:
#include<iostream>
bool is_prime(int x)
{
for (int i = 2; i <= sqrt(x); i++)
{
if (x%i == 0)
{
return false;
}
}
return true;
}
bool all_divided(int a, int b, int c)
{
long int num = a*b;
for (int i = c; i > 1; i--)
{
if (num%i !=0)
{
return false;
}
}
return true;
}
void main()
{
int x = 20;
long int product_prime = 6;
for (int i = 5; i < x; ++i)
{
if (is_prime(i))
{
product_prime *= i;
}
}
for (int j = 1; j < 10000; j++)
{
if (all_divided(j, product_prime, x))
{
std::cout << (j)*product_prime << std::endl;
break;
}
}
system("pause");
}
六、Project Euler 06:Sum square difference
Sum square difference
The sum of the squares of the first ten natural numbers is,
The square of the sum of the first ten natural numbers is,
Hence the difference between the sum of the squares of the first ten natural numbers and the square of the sum is 3025 − 385 = 2640.
Find the difference between the sum of the squares of the first one hundred natural numbers and the square of the sum.
1、问题描述
从1到10的平方的和为385,和的平方为3025,两者的差为3025 - 385 = 2640.
如果是前100个自然数,即从1到100,这两项的差值为多少?
答案为:25164150
2、第一遍刷Project Euler
思路:记得小学时候的奥数学过,计算从1到n的平方的和,可以利用公式:
计算从1到n的和的平方,可以利用求和公式:
因此完全可以利用上述的两个公式,编写两个函数直接计算这两项的结果,然后作差即可。
下面给出代码:
python版本的代码为:
def square_sum(x):
return (2*x+1)*(x+1)*x/6
def sum_square(x):
return (x*(x+1)/2)**2
def main(x):
return abs(square_sum(x)-sum_square(x))
if __name__ == '__main__':
print(main(100))
C++版本代码为:
#include<iostream>
long long int square_sum(int n)
{
return (2 * n + 1)*(n + 1)*n / 6;
}
long long int sum_square(int n)
{
return (n*(n + 1) / 2) * (n*(n + 1) / 2);
}
void main()
{
std::cout << abs(square_sum(100) - sum_square(100)) << std::endl;
system("pause");
}
七、Project Euler 07:10001st prime
10001st prime
By listing the first six prime numbers: 2, 3, 5, 7, 11, and 13, we can see that the 6th prime is 13.
What is the 10 001st prime number?
1、问题描述
前6个质数是2,3,5,7,11,13,第6个质数是13.
同理,那么第10001个质数是多少?
答案为:104743
2、第一遍刷Project Euler
思路:总体来说采用遍历的思路,如果一个数是质数,那么就记录下来同时计数器+1,最后当计数器=10001时输出该质数即可。这里需要写两个函数,一个是判断一个数是不是质数,另一个是遍历记录的函数。
在遍历质数的时候,除了2之后的所有质数都是奇数,因此我们可以从3开始,遍历所有的奇数,以减少循环次数。
python版本的代码为:
def is_prime(x):
for i in range(2, int(x**0.5 + 1):
if x % i == 0:
return False
return True
def find_prime(n):
count = 1
prime = []
for i in range(3, 99999999, 2):
if count == n:
print(count)
return print(prime[-1])
if is_prime(i):
count += 1
prime.append(i)
if __name__ == '__main__':
find_prime(10001)
C++版本的代码为:
#include<iostream>
#include<vector>
bool is_prime(long long int x)
{
for (long long int i = 2; i <= sqrt(x); i++)
{
if (x%i == 0)
{
return false;
}
}
return true;
}
void find_prime(long long int n)
{
std::vector<long long int> prime;
for (long int i = 3; i < 999999; i+=2)
{
if (is_prime(i))
{
prime.push_back(i);
}
}
std::cout << prime[n-2] << std::endl;
}
void main()
{
find_prime(10001);
system("pause");
}
八、Project Euler 08:Largest product in a series
Largest product in a series
The four adjacent digits in the 1000-digit number that have the greatest product are 9 × 9 × 8 × 9 = 5832.
73167176531330624919225119674426574742355349194934
96983520312774506326239578318016984801869478851843
85861560789112949495459501737958331952853208805511
12540698747158523863050715693290963295227443043557
66896648950445244523161731856403098711121722383113
62229893423380308135336276614282806444486645238749
30358907296290491560440772390713810515859307960866
70172427121883998797908792274921901699720888093776
65727333001053367881220235421809751254540594752243
52584907711670556013604839586446706324415722155397
53697817977846174064955149290862569321978468622482
83972241375657056057490261407972968652414535100474
82166370484403199890008895243450658541227588666881
16427171479924442928230863465674813919123162824586
17866458359124566529476545682848912883142607690042
24219022671055626321111109370544217506941658960408
07198403850962455444362981230987879927244284909188
84580156166097919133875499200524063689912560717606
05886116467109405077541002256983155200055935729725
71636269561882670428252483600823257530420752963450Find the thirteen adjacent digits in the 1000-digit number that have the greatest product. What is the value of this product?
1、问题描述
在1000个数字中,4个相连数字的最大乘积是9*9*8*9=5832,其位置如上标红处所示。
那么请找出13个相连数字的最大乘积。
答案为:23514624000
2、第一遍刷Project Euler
思路:将1000个数字以字符串的形式读取到内存中,然后逐个遍历,并计算相邻12个数的乘积。保存最大的乘积即可。
python版本代码为:
digit_matrix = (
"73167176531330624919225119674426574742355349194934"
"96983520312774506326239578318016984801869478851843"
"85861560789112949495459501737958331952853208805511"
"12540698747158523863050715693290963295227443043557"
"66896648950445244523161731856403098711121722383113"
"62229893423380308135336276614282806444486645238749"
"30358907296290491560440772390713810515859307960866"
"70172427121883998797908792274921901699720888093776"
"65727333001053367881220235421809751254540594752243"
"52584907711670556013604839586446706324415722155397"
"53697817977846174064955149290862569321978468622482"
"83972241375657056057490261407972968652414535100474"
"82166370484403199890008895243450658541227588666881"
"16427171479924442928230863465674813919123162824586"
"17866458359124566529476545682848912883142607690042"
"24219022671055626321111109370544217506941658960408"
"07198403850962455444362981230987879927244284909188"
"84580156166097919133875499200524063689912560717606"
"05886116467109405077541002256983155200055935729725"
"71636269561882670428252483600823257530420752963450"
)
def find_product(x):
# 存储最大乘积的变量
product_max = 1
for i in range(0, 1000-x):
# 存储相邻x数的临时变量
product_x = 1
for j in range(0, x+1):
# 计算相邻x个数的乘积,ord()是将字符转换成数字,ASCII码格式,数字的编号从48起,所以减去48
product_x *= (ord(digit_matrix[i+j])-48)
# 记录最大的乘积
if product_max < product_x:
product_max = product_x
print(product_max)
if __name__ == '__main__':
find_product(12) # 由于第一个数的编号是0,这里13个数则输入12
C++版本的代码为:
#include<iostream>
#include<string>
void find_product(int x, std::string number)
{
int str_len = number.length();
long long int product = 1;
for (int i = 0; i < str_len - x; i++)
{
//计算相邻x个数的乘积
long long int product_x = 1;
for (int j = 0; j < x; j++)
{
//数字0的ASCII码是48,因此要减去48
product_x *= int(number[i + j] - 48);
}
//判断乘积是否是最大值
if (product < product_x)
{
product = product_x;
}
}
std::cout << product << std::endl;
}
void main()
{
std::string number = "73167176531330624919225119674426574742355349194934"
"96983520312774506326239578318016984801869478851843"
"85861560789112949495459501737958331952853208805511"
"12540698747158523863050715693290963295227443043557"
"66896648950445244523161731856403098711121722383113"
"62229893423380308135336276614282806444486645238749"
"30358907296290491560440772390713810515859307960866"
"70172427121883998797908792274921901699720888093776"
"65727333001053367881220235421809751254540594752243"
"52584907711670556013604839586446706324415722155397"
"53697817977846174064955149290862569321978468622482"
"83972241375657056057490261407972968652414535100474"
"82166370484403199890008895243450658541227588666881"
"16427171479924442928230863465674813919123162824586"
"17866458359124566529476545682848912883142607690042"
"24219022671055626321111109370544217506941658960408"
"07198403850962455444362981230987879927244284909188"
"84580156166097919133875499200524063689912560717606"
"05886116467109405077541002256983155200055935729725"
"71636269561882670428252483600823257530420752963450";
find_product(13, number);
system("pause");
}
九、Project Euler 09:Special Pythagorean triplet
Special Pythagorean triplet
A Pythagorean triplet is a set of three natural numbers, a < b < c, for which,
For example,
There exists exactly one Pythagorean triplet for which a + b + c = 1000.
Find the product .
1、问题描述
一组毕达哥拉斯数是由三个数组成,且满足勾股定理,比如3,4,5
由唯一的一组毕达哥拉斯数的和为1000,求这组数的乘积
答案为:31875000
2、第一遍刷Project Euler
思路:三个数的和为1000,因此可以直接利用循环的思路来找这三个数。直接给出代码。
python版本的代码为:
def main(x):
for i in range(1, x):
for j in range(1, x):
if i**2 + j**2 == (x-i-j)**2:
print("a:{}, b:{}, c:{}, abc:{}".format(i,j,x-i-j, i*j*(x-i-j)))
return 0
if __name__ == '__main__':
main(1000)
C++版本的代码为:
#include<iostream>
void main()
{
int x = 1000;
for (int a = 1; a < x; a++)
{
for (int b = 1; b < x; b++)
{
int c = x - a - b;
if (a*a + b*b == c*c)
{
std::cout << a*b*c << std::endl;
goto break_loop;
}
}
}
break_loop: system("pause");
}
十、Project Euler 10:Summation of primes
Summation of primes
The sum of the primes below 10 is 2 + 3 + 5 + 7 = 17.
Find the sum of all the primes below two million.
1、问题描述
小于10的所有质数的和为2+3+5+7=17
那么小于2000000的所有质数的和为多少?
答案为:142913828922
2、第一遍刷Project Euler
思路:除了2之外的所有质数都为奇数,因此可以从3开始找所有的质数。这里需要准备两个函数,一个函数用于判断一个数是否为质数,另一个函数用于存储所有的质数,并累加他们的和。
python版本的代码为:
import numpy
def is_prime(x):
for i in range(2, int(numpy.sqrt(x))+1): # 求平方根可以用numpy.sqrt()
if x % i == 0:
return False
return True
def prime_sum(x):
sum = 0
prime = []
for i in range(3, x+1, 2):
if is_prime(i):
prime.append(i)
for j in prime:
sum += j
print(sum+2)
if __name__ == '__main__':
prime_sum(2000000)
C++版本的代码为:
#include<iostream>
#include<vector>
bool is_prime(long long int x)
{
for (long long int i = 2; i <= sqrt(x); i++)
{
if (x%i == 0)
{
return false;
}
}
return true;
}
void prime_sum(long long int n)
{
long long int sum=0;
std::vector<long long int> prime;
for (long int i = 3; i < n; i+=2)
{
if (is_prime(i))
{
prime.push_back(i);
}
}
for (auto val: prime)
{
sum += val;
}
std::cout << ((sum + 2)) << std::endl;
}
void main()
{
prime_sum(2000000);
system("pause");
}