1.获取10以内的质数,并且对这些质数进行求和

#实现, prime number:质数(除了1之外只能被1和自身整除的数才叫质数,1不是质数)
require 'prime' #prime是std库中
Prime.take_while{|i| i<=10}
Prime.take_while{|i| i<=10}.inject{|sum, num| sum+num }
Prime.take_while{|i| i<=10}.inject(:+) #inject的第二种方式求和

2.计算2**1000这个数的值展开之后各个数的累计值(比如2的4次方是16,累计值是7)。

#实现,不用each而是用map,each只是遍历值,返回的还是原来的值,而map会改变值,返回新值
(2**1000).to_s.split(//).map(&:to_i).inject(:+) #1366

3.计算1到1000的整数所代表的英文名称的字母数的总和(1,2两个数分别是one, two, 代表的字母数都是3,总和应该为6),同时需要去除空格和“横线”。

#实现,下面的delete方法不能合并,不能写delete(" ", "-"),方法是没有问题,但是会出错
require 'humanize'
(1..1000).to_a.map(&:humanize).map{|i|i.delete("-").delete(" ").length}.inject(:+) #21124,

4.1901年1月1日到2000年12月31日,每个月的第一天为星期天的日子总共有多少?

#一天的时间是86400 seconds
start = Time.local(1901)
finish = Time.local(2000, 12, 31)
count = 0
while finish >= start
  if finish.strftime("%A") == "Sunday" && finish.strftime("%d") == "01"
    count += 1
  end

  finish -= 86400
end
p count

5.实现Fibonacci数列

#使用递归实现斐波纳契整数数列F(n) = F(n-1) + F(n-2)
#第一种实现
def fibonacci(n)
  return 1 if n==0 || n==1
  fibonacci(n-2)+fibonacci(n-1)
end

#第二种实现
def calculateFibonacci(num)
  if num==0 || num==1
    1
  else
    calculateFibonacci(num-2)+calculateFibonacci(num-1)
  end
end

result ||= []
10.times do |i|
  result << calculateFibonacci(i)
end

6.计算100!并对这值的各个数求和

#分别定义阶乘和求和的算法
class Integer
  def factorial
    self==1 ? 1 : self*(self-1).factorial
  end

  def sum
    self.to_s.split(//).map(&:to_i).inject(:+)
  end
end

7.求最小公倍数

#计算依次能被1到20整除的数,其实就是求1到20的最小公倍数 least common multiple
(1..20).to_a.reduce(:lcm) #232792560

8.求0到9依次排列数字组成的数组,其中第1000000个数

#不考虑permutation内部的排列的机制,只取第1百万个数
[0,1,2,3,4,5,6,7,8,9].permutation.to_a[999999].join() #2783915460

9.求100的所有正整数因数

#计算
class Integer
  def factor_number
    array = []
    (1..self).each do |i|
      if self.remainder(i) == 0
        array << i
      end
    end
    array
  end
end
p 100.factor_number #[1, 2, 4, 5, 10, 20, 25, 50, 100]

10.

results matching ""

    No results matching ""