Problem1~10

社区里有不少project euler的题解,自己也写了些,主要是为了体验ruby的简洁(不过Mathematica好像更简单)


问题1: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.

(找出1000以内所有能被3或5整除的自然数之和)

 

s=0
1.upto 999 do |i|
  if((i%3==0)||(i%5==0))
    puts i
    s+=i
  end
end
 puts s

 

 

问题2: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, ...

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

(找出4百万以内Fibonacci数列中偶数之和)

 

  sum=2
  a=1
  b=2
  loop do
     c=a+b
     a=b
     b=c
     if(c%2==0)
        sum+=c
        puts "sum="+sum.to_s
      end
      break if(c>=4000000)
    end
    puts "terminal="+sum.to_s

 

 

 

问题3:The prime factors of 13195 are 5, 7, 13 and 29.

What is the largest prime factor of the number 600851475143 ?

(找出600851475143的最大质因数

ps:这问题好像是为了下面某些题做铺垫吧,如果只是用ruby内置的质数生成器也颇费时间(建议还是用sieve吧)

 

require 'mathn'

sum_prime=Prime.new
sum_prime.each{|prime| break if prime>=2000000;print " "+prime.to_s }

 

 

问题4: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. 

(在所有两个三位数的积中找出最大的回文数)

 

r=0
t=0
100.upto(999) do |i|
  100.upto(999) do |j|
    is=true
    s=(i*j).to_s
    len=s.size
    0.upto(len/2-1) do |k|
      if s[k,1]!=s[-k-1,1]
        is=false
        break
      end
    end
    if is==true
      t=i*j
    end
    if t>r
      r=t
    end
  end
end  

puts r
 

 

问题5: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到20整除的最小正整数)

 

def p5(n)
  r=1
  2.upto(n-1) do |i|
    if r<i+1
      r=r*(i+1)/gcd(i+1,r)
    else
      r=r*(i+1)/gcd(r,i+1)
    end
  end
  puts r
end
  
  
def gcd(a,b)
  if b==0
    a
  else
    gcd(b,a%b)
  end
end

p5(20)
 

 

问题6:Find the difference between the sum of the squares of the first one hundred natural numbers and the square of the sum.

(找出100以内所有自然数的平方和与和的平方的差值)

 

sum=0
count=0
1.upto(9) do |i|
  (i+1).upto(10) do |j|
    sum+=i*j
  end
end
  
puts 2*sum
 

 

问题7: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 10001st prime number?

(找出第10001个素数)

 

	public static void main(String[] args) {
		int count = 0;
		int n = 2;
		while(count!=10001){
			if(MathUtil.isPrime(n))
				count++;
			n++;
		}
		
		System.out.println(n-1);

	}

}

 

 

问题8:Find the greatest product of five consecutive digits in the 1000-digit number.

(在给出的一千个数字中找出5个连续数字使他们的积最大)

ps:方法2比方法1速度更快

 

s="73167176531330624919225119674426574742355349194934
96983520312774506326239578318016984801869478851843
85861560789112949495459501737958331952853208805511
12540698747158523863050715693290963295227443043557
66896648950445244523161731856403098711121722383113
62229893423380308135336276614282806444486645238749
30358907296290491560440772390713810515859307960866
70172427121883998797908792274921901699720888093776
65727333001053367881220235421809751254540594752243
52584907711670556013604839586446706324415722155397
53697817977846174064955149290862569321978468622482
83972241375657056057490261407972968652414535100474
82166370484403199890008895243450658541227588666881
16427171479924442928230863465674813919123162824586
17866458359124566529476545682848912883142607690042
24219022671055626321111109370544217506941658960408
07198403850962455444362981230987879927244284909188
84580156166097919133875499200524063689912560717606
05886116467109405077541002256983155200055935729725
71636269561882670428252483600823257530420752963450"

a=s.split(//)
a.delete("\n")
length=a.size
0.upto(length) do |i|
  a[i]=a[i].to_i
end

sum=1

def one(sum,a,length)
  0.upto(length-5) do |i|
    i.upto(i+4) do |k|
      if a[k]==0
        i=k+1
        break
      else
        tmp=1
        i.upto(i+4) do |j|
          tmp*=a[j]
        end
        sum=tmp if tmp>sum
      end
    end   #跳过包含0的序列 
    
  end
  puts sum
end

def two(sum,a,length)
  0.upto(length-5) do |i|
    tmp=1
    i.upto(i+4) do |j|
      tmp*=a[j]
    end
    sum=tmp if tmp>sum
  end
  puts sum
end

one(sum,a,length)
two(sum,a,length)

require 'benchmark'
Benchmark.bmbm(7) do |t|
  t.report("1"){one(sum,a,length)}
  t.report("2"){two(sum,a,length)}
end

 

 

问题9:There exists exactly one Pythagorean triplet for which a + b + c = 1000.

Find the product abc.

(找出满足和为1000的勾股数,并计算他们的积)

ps:暴力搜索

 

 

public class Problem9 {
	public static void main(String[] args) {
		for(int a = 1; a<1000; a++)
			for(int b = 1; b<1000; b++){
				int t = a+b;
				if(t>500 && t<1000){
					if(Math.pow(a, 2)+Math.pow(b, 2)==Math.pow(1000-t, 2))
						System.out.println(a+" "+b);
				}
			}
	}
}
 

 

问题10:The sum of the primes below 10 is 2 + 3 + 5 + 7 = 17.

Find the sum of all the primes below two million.

(找出2百万以内所有素数之和)

ps:用优化的筛法效率更快

 

def array_sieve(n)
  a=Array.new(n,0)
  sum=2
  r=((n-1)**0.5).floor
  i=3
  while(i<=r)
    if(a.at(i)==0)
      sum+=i
      j=i*i
      while(j<=n-1)
        a[j]=1
        j+=2*i
      end
    end
    i+=2
  end

  if r%2==0
    i=r+1
  else
    i=r+2
  end
  while(i<n)
    if(a.at(i)==0)
      sum+=i
    end
    i+=2
  end
  puts sum
end
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值