Project-Euler problem 1-50

最近闲的做了下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]

Problem  15 Lattice pat

  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值