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.