最近闲的做了下Project Euler 上的题目,前面50题都比较简单,简单总结下。代码一般是Python和C/C++的 用Python 做这些题目简直是酸爽啊
一下代码可能不一定是我的,因为不知道论坛里面的回复不是永久的,所以我的代码有的丢了,可能找个和我的意思相近的代码。题目翻译是从
欧拉计划 | Project Euler 中文翻译站上面Copy 的。
Problem 1 Multiples of 3 and 5
10以下的自然数中,属于3和5的倍数的有3,5,6和9,它们之和是23.找出1000以下的自然数中,属于3和5的倍数的数字之和。print sum([x for x in range(1000) if x%3==0 or x%5==0])
Problem 2 Even Fibonacci numbers
斐波那契数列中的每一项被定义为前两项之和。从1和2开始,斐波那契数列的前十项为:
1, 2, 3, 5, 8, 13, 21, 34, 55, 89, ...
考虑斐波那契数列中数值不超过4百万的项,找出这些项中值为偶数的项之和。
ls=[1,1]
ans=0
while ls[-1] <4000000:
ls.append(ls[-1]+ls[-2])
if (ls[-1]&1) == 0:
ans+=ls[-1]
python make it easy
Problem 3 Largest prime factor
13195的质数因子有5,7,13和29.600851475143的最大质数因子是多少?
>>> ans=0
>>> i=3
>>> num=600851475143
>>> while i<= num:
if num%i==0:
num/=i
ans=i
i-=1
i+=1
>>> ans
6857
Problem 4 Largest palindrome product
一个回文数指的是从左向右和从右向左读都一样的数字。最大的由两个两位数乘积构成的回文数是9009 = 91 * 99.找出最大的有由个三位数乘积构成的回文数。
>>>def isPal(n):
m=n
r=0;
while m <> 0:
r=r*10+m%10
m/=10
return n==r
>>> ans=0
>>> for i in range(100,999,1):
for j in range (i,999,1):
if isPal(i*j) and i*j >ans:
ans=i*j
>>> ans
906609
Problem 5 Smallest multiple
2520是最小的能被1-10中每个数字整除的正整数。最小的能被1-20中每个数整除的正整数是多少?
>>>def gcd (a ,b):
if a<b:
a,b=b,a
if b==0:
return a
else:
return gcd(b,a%b)
>>>for i in range(1,21,1):
tmp=gcd(i,ans)
ans=ans*i/tmp
>>>ans
232792560L
Problem 6 Sum square difference
前十个自然数的平方和是:
1^2 + 2^2 + ... + 10^2 = 385
前十个自然数的和的平方是:
(1 + 2 + ... + 10)^2 = 55^2 = 3025
所以平方和与和的平方的差是3025 − 385 = 2640.
找出前一百个自然数的平方和与和平方的差。
sum(range(1,101,1))**2-sum([x*x for x in range(1,101,1)])
Problem 7 10001st prime
前六个质数是2,3,5,7,11和13,其中第6个是13.第10001个质数是多少?
>>>j=3
>>> prime=[2]
>>> while i<10001:
tmp=j
for x in prime:
if tmp%x==0:
tmp=0
break
if tmp<>0:
prime.append(j)
i+=1
j+=1
>>> prime[10000]
104743
Problem 8 Largest product in a series
找出以下这个1000位的整数中连续13个数字的最大乘积。 数太占面积不贴了
暴力吧,代码丢了
Problem 9 Special Pythagorean triplet
一个毕达哥拉斯三元组是一个包含三个自然数的集合,a<b<c,满足条件:
a^2 + b^2 = c^2
例如:3^2 + 4^2 = 9 + 16 = 25 = 5^2.
已知存在并且只存在一个毕达哥拉斯三元组满足条件a + b + c = 1000。
找出该三元组中abc的乘积,代码丢了,论坛偷的代码
def main():
for m in range(2, 500):
for n in range(1, m):
if 2*m*n + 2*m*m == 1000:
a, b, c = 2*m*n, m*m - n*n, m*m + n*n
print(a, b, c)
print(a*b*c)
return
if __name__ == "__main__":
main()
Problem 10 Summation of primes
10以下的质数的和是2 + 3 + 5 + 7 = 17.找出两百万以下所有质数的和。筛法随便搞下就可以
#include<iostream>
#define MAXN 2000001
using namespace std;
int bprime[MAXN]={0};
int main()
{
for (int i=2;i<2000;i++)
if(!bprime[i])
for(int j=2;i*j<=MAXN;j++)
bprime[i*j]=1;
long long ans=0;
for(int i=2;i<MAXN;i++)
if(!bprime[i]) ans+=i;
cout<<ans<<endl;
return 0;
}
Problem 11 Largest product in a grid
在以下这个20×20的网格中,四个处于同一对角线上的相邻数字用红色标了出来:
大数字矩阵不贴了
这四个数字的乘积是:26 × 63 × 78 × 14 = 1788696.
在这个20×20网格中,处于任何方向上(上,下,左,右或者对角线)的四个相邻数字的乘积的最大值是多少?
#include<iostream>
#include<algorithm>
using namespace std;
int data[30][30]={0};
int main()
{
for(int i=0;i<20;i++)
for(int j=0;j<20;j++)
cin>>data[i+5][j+5];
int ans=0,tmp;
for(int i=5;i<25;i++)
for(int j=5;j<25;j++)
{
tmp=data[i][j]*data[i+1][j]*data[i+2][j]*data[i+3][j];
ans=max(tmp,ans);
tmp=data[i][j]*data[i+1][j+1]*data[i+2][j+2]*data[i+3][j+3];
ans=max(tmp,ans);
tmp=data[i][j]*data[i][j+1]*data[i][j+2]*data[i][j+3];
ans=max(tmp,ans);
tmp=data[i][j]*data[i-1][j+1]*data[i-2][j+2]*data[i+1][j-1];
ans=max(tmp,ans);
}
cout<<ans<<endl;
return 0;
}
Problem 12 Highly divisible triangular number
三角形数序列是由对自然数的连加构造而成的。所以第七个三角形数是1 + 2 + 3 + 4 + 5 + 6 + 7 = 28. 那么三角形数序列中的前十个是:
1, 3, 6, 10, 15, 21, 28, 36, 45, 55, ...
下面我们列出前七个三角形数的约数:
1: 1
3: 1,3
6: 1,2,3,6
10: 1,2,5,10
15: 1,3,5,15
21: 1,3,7,21
28: 1,2,4,7,14,28
可以看出28是第一个拥有超过5个约数的三角形数。
那么第一个拥有超过500个约数的三角形数是多少?
#include<iostream>
using namespace std;
int getFactors(long long n)
{
int ans=0;
for(int i=1;i*i<=n;i++)
if(n%i==0)
ans+=2;
return ans;
}
int main()
{
long long sum=1;
int i=1;
while(getFactors(sum)<500)
sum+=++i;
cout<<sum<<" "<<i<<" "<<getFactors(sum)<<endl;
return 0;
}
Problem 13 Large sum
找出以下100个50位数之和的前十位数字。数字不贴了,Python支持大数这就不是问题了
Problem 14 Longest Collatz sequence
以下迭代序列定义在整数集合上:
n → n/2 (当n是偶数时)
n → 3n + 1 (当n是奇数时)
应用以上规则,并且以数字13开始,我们得到以下序列:
13 → 40 → 20 → 10 → 5 → 16 → 8 → 4 → 2 → 1
可以看出这个以13开始以1结束的序列包含10个项。虽然还没有被证明(Collatz问题),但是人们认为在这个规则下,以任何数字开始都会以1结束。
以哪个不超过100万的数字开始,能给得到最长的序列?
注意: 一旦序列开始之后,也就是从第二项开始,项是可以超过100万的。
def get(n):
while n<>1:
if n&1:
n=3*n+1
else:
n>>=1
yield n
>>> ans=[0,0]
>>> for x in xrange(1,1000001,1):
tmp=len([i for i in get(x)])
if tmp>ans[0]:
ans[0]=tmp
ans[1]=x
>>> ans
[524, 837799]